用于通过 HTTP 上传文件作为 multipart/form-data 的 Linux 命令行工具?

kdt*_*kdt 26 upload wget http

我可以看到 wget 有一个--post-file选项,但联机帮助页说

Wget 目前不支持 multipart/form-data 传输 POST 数据;只有应用程序/x-www-form-urlencoded。只应指定--post-data和之一--post-file

有没有类似的方法可以在 multipart/form-data 中上传文件?

Tob*_*obu 31

使用卷曲:

curl -F "file=@localfile;filename=nameinpost" url.com
Run Code Online (Sandbox Code Playgroud)


tu-*_*duh 19

仅使用 wget 就可以做到这一点。至少在版本 1.13.4 和其他版本中。--post-file 选项允许您指定要发送的文件,只要 postdata 文件构造正确。

我还用二进制文件对此进行了测试,它按预期工作。您不需要对文件进行 base64 编码,但您需要确保您的文件不包含边界。

使这项工作所需的最低命令是:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform
Run Code Online (Sandbox Code Playgroud)

并且 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--
Run Code Online (Sandbox Code Playgroud)

一些细节在这里很重要:

  1. 发布数据文件中的行以 \r\n 终止。唯一的例外是文件上下文中的数据。
  2. postdata 中的每个 BOUNDARY 属性都必须与 wget 调用中的 BOUNDARY 值匹配。(示例中的 FILEUPLOAD)
  3. 所有边界都以两个连字符“--”为前缀,并以 \r\n 结尾
  4. 最后一个边界以两个额外的连字符“--”为后缀,并以 \r\n 结尾
  5. 每一条数据、文件内容或参数值,都被一个空行“\r\n”包围

我认为这可能对某人有所帮助,因为某些受控环境有 wget 但没有 curl。

  • 缺少一个分号。它导致了 python tornado --header="Content-type: multipart/form-data; boundary=FILEUPLOAD" 的问题 (2认同)