It is possible to do this with wget only. At least with version 1.13.4 and maybe others. The --post-file option allows you to specify a file to send, so long as the postdata file is constructed properly.
CAVEAT: I have not yet tested this with binary files. Additional processing of the binary may be required to avoid collision with boundaries. I see this as a separate problem, tho, since processing of the binary is different dependent on the file type.
The minimum command required to make this work would be:
wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform
and the postdata file would need to contain something like:
Content-Disposition: form-data; name="comment"
I love uploading files!
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin";
Media Type: application/octet-stream
Give me some automated file upload action!
A number of details are important here:
- Lines in the post data file are terminated with \r\n. The only exception is data inside the file context.
- Every BOUNDARY attribute in the postdata must match the BOUNDARY value in the call to wget. (FILEUPLOAD in the example)
- All boundaries are prefixed with two hyphens "--" and terminated with \r\n
- The last boundary is suffixed with two extra hyphens "--" and terminated with \r\n
- Each piece of data, file content or parameter value, is surrounded by an empty line "\r\n"
I thought this might help someone since some controlled environments have wget but not curl.