Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Запрос функции: /tool fetch HTTP-POST может отправлять файл

    Запрос функции: /tool fetch HTTP-POST может отправлять файл

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Запрос функции: /tool fetch HTTP-POST может отправлять файл, RouterOS
     
    vanikcz
    Guest
    #1
    0
    05.01.2022 07:40:00
    Дорогие участники форумов Mikrotik, было бы здорово, если бы команда /tool/fetch http-method=post url="https://blabla.server/fileservice" mode=https могла указывать файл на Mikrotik, который будет отправлен в качестве данных POST-запроса. И желательно без этого раздражающего ограничения в 4 КБ! Можно ли надеяться, что это когда-нибудь реализуют?
     
     
     
    hkusulja
    Guest
    #2
    0
    24.01.2022 20:16:00
    Я тоже надеюсь, что эту функцию внедрят. Тогда я смогу написать скрипт, который будет загружать мои резервные копии и /export на удалённый HTTPS-сервер…
     
     
     
    msatter
    Guest
    #3
    0
    24.01.2022 20:25:00
    Лучше без этого надоедливого ограничения в 4kB или 63KB! К тому же:  
    :set $data "up to 63KB..."  
    /tool fetch http-method=post http-content-type="application/json" http-data=$data url="https://testserver.lv/index.php"  
    https://help.mikrotik.com/docs/display/ROS/Fetch  

    Дальше, для скачивания можно использовать «порционную загрузку» (chunking), если сервер это поддерживает. Не знаю, поддерживается ли «порционная загрузка» при отправке данных.

    http://forum.mikrotik.com/t/how-to-download-only-one-piece-of-file-at-a-time-with-tool-fetch-and-put-it-inside-a-variable/151020/1
     
     
     
    hkusulja
    Guest
    #4
    0
    24.01.2022 23:22:00
    Не могли бы вы помочь, как считать содержимое файла (.backup и .rsc) с локального хранилища Mikrotik, чтобы потом загрузить его на удалённый HTTPS-сервер с помощью $data? Я не понимаю, как можно использовать передачу частями для загрузки через HTTP PUT. Не могли бы вы привести ссылку на документацию, где говорится, что размер $data ограничен 63 КБ в RouterOS 7?
     
     
     
    msatter
    Guest
    #5
    0
    25.01.2022 16:58:00
    Mikrotik не реализовал способ чтения файлов размером больше 63 КБ. Записывать более крупные файлы можно с помощью команды execute. Думаю, это не документировано, но лимит в 63 КБ для переменных — реальность в ROS 6 и 7. Несколько месяцев назад никто не знал, что можно использовать разбивку на части вместе с переменными в ROS, а теперь это широко применяется.
     
     
     
    vanikcz
    Guest
    #6
    0
    30.01.2022 22:49:00
    Дорогой msatter, не подскажете, как загрузить файл размером 60 кБ в переменную? Не могу найти ни одного примера… Спасибо!
     
     
     
    hkusulja
    Guest
    #7
    0
    10.02.2022 06:19:00
    @msatter Я тоже заинтересован и не нашёл документированного способа загрузить файл в переменную в RouterOS 7, когда файл больше 10 КБ, но меньше 60 КБ.
     
     
     
    hkusulja
    Guest
    #8
    0
    25.02.2022 08:19:00
    Я провёл тест:  
    :global $data "test";  
    :global $url "https://prod-51.westeurope.logic.azure.com:443/workflows/blabla/triggers/manual/paths/invoke....";  
    /tool fetch mode=https http-method=put http-data=$data url=$url  

    И получил такой ответ, что вроде бы нормально:  
    {  
       "headers": {  
           "User-Agent": "Mikrotik/7.x,Fetch",  
           "Content-Type": "application/x-www-form-urlencoded"  
       },  
       "body": {  
           "$content-type": "application/x-www-form-urlencoded",  
           "$content": "dGVzdA==",  
           "$formdata": [
               {  
                   "key": "test",  
                   "value": ""  
               }  
           ]  
       }  
    }  

    Однако, если я пытаюсь загрузить содержимое файла в переменную (файл примерно 7 КБ) так:  
    /export file=export.rsc  
    :global data [/file get [/file find name=export.rsc] contents];

    и после этого выполнить http fetch, то на http-сервере тело запроса не приходит. Как отправить содержимое файла? И ещё, как передавать файлы экспорта и бэкапа через HTTP?
     
     
     
    msatter
    Guest
    #9
    0
    25.02.2022 12:04:00
    Это первый пример кода в этой ветке: http://forum.mikrotik.com/t/how-to-download-only-one-piece-of-file-at-a-time-with-tool-fetch-and-put-it-inside-a-variable/151020/1
     
     
     
    hkusulja
    Guest
    #10
    0
    25.02.2022 12:32:00
    Это пример для «скачивания файла» с использованием чанков. Моя задача — «загрузить файл», который не превышает 64 КБ.
     
     
     
    Amm0
    Guest
    #11
    0
    10.03.2022 17:22:00
    Ключевой момент — что принимает другая сторона. Предположу, что ты говоришь о curl, который поддерживает опцию «-F» для форм и использование «@» для включения файла. Это зависит от HTML5-элемента <… input=file> внутри формы, а enctype может быть «multipart/form-data» или «x-www-form-urlencoded» (curl по умолчанию выбирает один из вариантов в зависимости от версии и content-type). Так что это ДВА типа загрузки файлов, и есть ещё другие способы. Но в отличие от curl, /tool/fetch никак не помогает с частью data=.

    Насколько я знаю, я не видел скриптов, которые собирают нужный MIME или кодируют /file. И если это бинарный файл, даже скрипт может не получить доступ к содержимому файла для отправки или кодирования без дополнительного программирования. Для текстовых файлов, возможно, можно собрать нужные data= для загрузки, но это не просто.

    В общем, RouterOS не имеет ни одного примитива для сборки или парсинга HTTP content-type. Он охотно отправит content-type и любые данные, которые ты запишешь в скриптовую переменную типа «str». Но с самой частью данных сегодня он никак не поможет.

    Сейчас даже нельзя кодировать или декодировать JSON в массив RouterOS, и это, по моему мнению, ещё большее ограничение. Поэтому нужны скрипты для работы с JSON или расширения вроде «chunk download» от rextended, чтобы обойти проблемы с поддержкой HTTP данных. Может кто-то знает обходной путь с формами и кодированием… но тебе стоит рассмотреть другие варианты передачи файлов, кроме «HTTP загрузки». Например, можно сделать REST API или SFTP на веб-сервере и забирать файл по HTTP-запросу.
     
     
     
    hkusulja
    Guest
    #12
    0
    11.03.2022 07:44:00
    В моём случае использовать SFTP или что-то подобное невозможно по другим причинам. Я в курсе этих вариантов. Давайте сосредоточимся именно на том, как хоть каким-то образом отправить любой файл с MikroTik на удалённый HTTP-сервер (не наоборот и не что-то ещё). С другой стороны — HTTP-вебсервер, работающий со стандартным HTTP. Я контролирую этот сервер и могу запрограммировать всё, что нужно. Пока что я настроил HTTP REST API endpoint, который принимает любые данные, чтобы хоть как-то получить файл с MikroTik. Что касается типа контента, его можно вручную задать через /tool fetch, как я вижу, но я могу исправить это и на стороне сервера. Мне вообще не нужна никакая обработка JSON на стороне RouterOS. Так что в чём именно ограничение RouterOS для /tool fetch при работе с HTTP POST для отправки файла? Думаю, просто не хватает документации, но может быть, что-то не реализовано или работает хуже — какие именно функции?
     
     
     
    Amm0
    Guest
    #13
    0
    11.03.2022 12:10:00
    Это невозможно. Mikrotik должен добавить поддержку этого. Поскольку у них накопился список багов и других функций, возможно, придётся ждать долго. По сути, /tool/fetch позволяет только отправлять строку (но эта строка может быть любой). В RouterOS нет никаких инструментов для кодирования отправки формы (а файл — это как раз один из типов формы). И ещё, скрипты RouterOS могут читать файлы только до 4 Кб в строку, так что это исключает более продвинутые решения через скрипты.

    В общем, чтобы это заработало, для начала нужно сделать возможность отправки любых данных из файла, например так:

    :global filedata [/file get myfile contents]
    :put $filedata
     
     
     
    hkusulja
    Guest
    #14
    0
    06.04.2022 08:08:00
    @Amm0 https://help.mikrotik.com/docs/display/ROS/Scripting#Scripting-Variables Примечание: размер значения переменной ограничен 4096 байт https://help.mikrotik.com/docs/display/ROS/Fetch /export file=export.rsc :global data [/file get [/file find name=export.rsc] contents]; :global $url "https://prod-51.westeurope.logic.azure.com:443/workflows/blabla/triggers/manual/paths/invoke …"; /tool fetch mode=https http-method=put http-data=$data url=$url
     
     
     
    Amm0
    Guest
    #15
    0
    06.04.2022 13:54:00
    Слушай, я не спорю, что в ROS не стоит поддерживать какой-то «файл-аплоад». Я всего лишь говорил, что «загрузка файлов» может происходить по-разному (form-data, WebDAV и прочее) — так что тут не всё так просто, как просто добавлять «files=» в fetch. Ты спрашиваешь: «Должен же быть какой-то обходной путь!»

    Вот в чём проблема: как ты и отметил, переменные ограничены по размеру, поэтому в скриптах ROS нельзя закодировать что-то больше 4К. Так что да, возможно, вариантов больше, если бы переменные были больше 4К. Но здесь, скорее всего, дело в том, что переменные в ROS мало чем отличаются от переменных окружения, а в ядре Linux есть ограничение на их размер. Поскольку скрипты должны одинаково работать как на CHR, так и на mAP, это ограничение не может быть слишком большим — иначе скрипты на устройствах с малой памятью сломаются. И «бесконечно большие» переменные — это просто лазейка для переполнений буфера.

    Скорее всего, контейнеры (например, Docker) придут первыми, и тогда можно будет просто поднять контейнер, чтобы запустить curl или любой другой нужный метод. Должен ли /tool/fetch иметь больше опций для “curl-форматирования”? За меня бы ты получил голос «за».
     
     
     
    hkusulja
    Guest
    #16
    0
    06.04.2022 14:34:00
    Я понимаю вашу точку зрения насчет того, что возможность отправить файл бывает разная. В моём случае я тестировал с файлом test.txt около 1 КБ, и ничего не работает — полученные данные никак не содержат данные из файла.
     
     
     
    vittore
    Guest
    #17
    0
    20.04.2022 09:15:00
    +1 за эту функцию
     
     
     
    Deeleave
    Guest
    #18
    0
    21.04.2022 05:08:00
    +1 за эту функцию
     
     
     
    Shikiko
    Guest
    #19
    0
    21.04.2022 08:27:00
    Плюс один за эту функцию
     
     
     
    user41
    Guest
    #20
    0
    10.03.2024 11:23:00
    *) fetch — добавлена опция «head» для параметра «http-method»;  
    *) fetch — добавлена опция «patch» для параметра «http-method»;  
    *) fetch — теперь можно указывать link-local адрес в режиме FTP;  
    *) fetch — параметры certificate и check-certificate теперь работают только в режиме HTTPS;  
    *) fetch — больше не требует «content-length» для HTTP (введено в v7.13);  
    *) fetch — исправлено разрешение DNS, когда у домена есть только записи AAAA (введено в v7.13);  
    *) fetch — исправлена работа fetch при получении неожиданных данных в HTTP-пейлоаде;  
    *) fetch — исправлена работа fetch при использовании «src-path» в HTTP/HTTPS режимах (введено в v7.13);  
    *) fetch — исправлена работа fetch при использовании «src-path» в режиме SFTP (введено в v7.13);  
    *) fetch — исправлено некорректное сообщение об ошибке «src-path» при «upload=yes»;  
    *) fetch — исправлена запись IPv4 адреса в логах (введено в v7.13);  
    *) fetch — улучшена стабильность в режиме SFTP;  
    *) fetch — улучшена стабильность скачивания файлов в HTTP/HTTPS режимах;  
    *) fetch — сокращена многословность логов;  
    *) fetch — выводятся все заголовки «Set-Cookies» в ответе;  
    *) fetch — любой код HTTP ответа, начинающийся на 2xx, теперь считается успешным (введено в v7.13).  

    А как насчёт multipart/form-data?
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры