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

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

我可以看到 wget 有一个--post-file选项,但是手册页说

Wget 目前不支持 multipart/form-data 传输 POST 数据;仅支持 application/x-www-form-urlencoded。只需指定--post-data和中的一个即可。--post-file

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

答案1

使用 curl:

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

答案2

仅使用 wget 即可实现此操作。至少使用版本 1.13.4 或其他版本。只要正确构建了 postdata 文件,--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--

这里有几个细节很重要:

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

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

答案3

这对我有用:

curl -v -F filename=image.jpg -F [email protected] http://localhost:8080/api/upload

答案4

以下对我有用wget

wget --method PUT --body-file=/home/sk/file.pdf https://transfer.sh/file.pdf -O - -nv

致谢:https://ostechnix.com/easy-fast-way-share-files-internet-command-line/

相关内容