Инструмент командной строки Linux для загрузки файлов по HTTP как multipart / form-data?

25

Я вижу, что у wget есть --post-fileопция, но на man-странице написано

Wget в настоящее время не поддерживает multipart / form-data для передачи данных POST; только приложение / x-www-form-urlencoded. Только один из --post-dataи --post-fileдолжен быть указан.

Есть ли аналогичный способ загрузки файлов в multipart / form-data?

КДТ
источник

Ответы:

31

Используйте curl:

curl -F "file=@localfile;filename=nameinpost" url.com
Tobu
источник
17

Это можно сделать только с помощью wget. По крайней мере, с версией 1.13.4 и, возможно, другие. Опция --post-file позволяет вам указать файл для отправки, если файл постданных построен правильно.

Я также проверил это с бинарными файлами, и он работает как ожидалось. Вам НЕ нужно кодировать файл в base64, но вы должны убедиться, что ваш файл не содержит границы.

Минимальная команда, необходимая для выполнения этой работы, будет:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

и файл постданных должен содержать что-то вроде:

--FILEUPLOAD
Content-Disposition: form-data; name="comment"

I love uploading files!

--FILEUPLOAD
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; 
Content-Type: application/octet-stream
Media Type: application/octet-stream

Give me some automated file upload action!

--FILEUPLOAD--

Здесь важен ряд деталей:

  1. Строки в файле данных постов заканчиваются на \ r \ n. Единственным исключением являются данные внутри контекста файла.
  2. Каждый атрибут BOUNDARY в postdata должен соответствовать значению BOUNDARY в вызове wget. (FILEUPLOAD в примере)
  3. Все границы начинаются с двух дефисов "-" и заканчиваются на \ r \ n
  4. К последней границе добавляется два лишних дефиса "-" и заканчивается \ r \ n
  5. Каждый фрагмент данных, содержимое файла или значение параметра заключено в пустую строку "\ r \ n"

Я подумал, что это может кому-то помочь, поскольку в некоторых контролируемых средах есть wget, но нет скручивания.

Tu-Reinstate Моника-Дор Дух
источник
Я не мог заставить wget работать с двоичным файлом. Я создал текстовую часть файла данных поста, сохранил, использовал cat pic.jpg >> postdata, загрузил в Notepad ++ и добавил последнюю границу + '-' + EOL. Ссылка W3C
Хлоя
@Chloe, я должен был вернуться к этому для другого проекта, и на этот раз были нужны бинарные файлы, и я обнаружил, что он работает как ожидалось. Я создал простую страницу загрузки php-файлов, а затем сделал это через браузер, чтобы сначала получить размер файла, а затем сравнил его с результатом использования wget. Я бы посоветовал вам сделать то же самое, поскольку случайный перевод строки может привести к сбою всего процесса.
Tu-Reinstate Monica-dor duh
1
Точка с запятой отсутствует. Это вызвало проблемы с python tornado --header = "Content-type: multipart / form-data; border = FILEUPLOAD"
FlappySocks