Інструмент командного рядка Linux для завантаження файлів через HTTP у вигляді багаточастинних / форм-даних?


25

Я бачу, що у wget є --post-fileваріант, але в manpage написано

В даний час Wget не підтримує багаточастинні / форми даних для передачі даних POST; тільки додаток / x-www-form-urlencoded. Тільки один з --post-dataі --post-fileповинен бути вказаний.

Чи існує подібний спосіб завантаження файлів у багаточастинні / форми-дані?

Відповіді:


31

Використовуйте curl:

curl -F "file=@localfile;filename=nameinpost" url.com

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 у поштових даних повинен відповідати значенню BOUNDARY у виклику wget. (ФАЙЛУВАННЯ в прикладі)
  3. Усі межі мають префікс з двома дефісами "-" і закінчуються \ r \ n
  4. Остання межа суфіксна з двома зайвими дефісами "-" і закінчується \ r \ n
  5. Кожен фрагмент даних, вміст файлу або значення параметра оточений порожнім рядком "\ r \ n"

Я подумав, що це може допомогти комусь, оскільки деякі контрольовані середовища мають wget, але не згортаються.


Я не зміг заставити wget працювати з двійковим файлом. Я створив текстову частину файлу даних публікації, зберег, використав cat pic.jpg >> postdata, завантажив у Блокнот ++ та додав останній кордон + '-' + EOL. Довідник W3C
Хлоя

@Chloe, мені довелося переглянути це ще для іншого проекту, і цього разу потрібні були бінарні файли, і він виявив, що він працює як слід. Я створив просту сторінку завантаження файлів PHP, а потім зробив це через браузер, щоб спочатку отримати розмір файлу, а потім порівняти його з результатом за допомогою wget. Я б запропонував вам зробити те саме, оскільки бродячий новий рядок може спричинити збій всього процесу.
tu-Reinstate Monica-dor duh

1
Точка з комою відсутня. Це спричинило проблеми з python tornado --header = "Тип вмісту: багаточастинні / форми-дані; межа = FILEUPLOAD"
FlappySocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.