Это можно сделать только с помощью wget. По крайней мере, с версией 1.13.4 и, возможно, другие. Опция --post-file позволяет вам указать файл для отправки, если файл постданных построен правильно.
Я также проверил это с бинарными файлами, и он работает как ожидалось. Вам НЕ нужно кодировать файл в base64, но вы должны убедиться, что ваш файл не содержит границы.
Минимальная команда, необходимая для выполнения этой работы, будет:
wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform
и файл postdata должен содержать что-то вроде:
--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--
Здесь важен ряд деталей:
- Строки в файле данных постов заканчиваются на \r \n. Единственным исключением являются данные внутри контекста файла.
- Каждый атрибут BOUNDARY в postdata должен соответствовать значению BOUNDARY в вызове wget. (FILEUPLOAD в примере)
- Все границы начинаются с двух дефисов "-" и заканчиваются на \r \n
- К последней границе добавляется два лишних дефиса "-" и заканчивается \r \n
- Каждый фрагмент данных, содержимое файла или значение параметра заключено в пустую строку "\r \n"
Я подумал, что это может кому-то помочь, поскольку в некоторых контролируемых средах есть wget, но нет скручивания.