Linux命令行工具,用于通过HTTP作为多部分/表单数据上传文件?


25

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

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

有没有类似的方式可以上传多部分/表单数据中的文件?

Answers:


31

使用卷曲:

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

17

只能使用wget进行此操作。至少在1.13.4版本中,也许在其他版本中。--post-file选项允许您指定要发送的文件,只要正确构造了postdata文件即可。

我还用二进制文件对此进行了测试,它可以按预期工作。您不需要对文件进行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. postdata中的每个BOUNDARY属性必须与对wget的调用中的BOUNDARY值匹配。(在示例中为FILEUPLOAD)
  3. 所有边界都以两个连字符“-”为前缀,并以\​​ r \ n结尾
  4. 最后一个边界后缀两个额外的连字符“-”,并以\ r \ n结尾
  5. 每条数据,文件内容或参数值都用空行“ \ r \ n”包围

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


我无法使用wget处理二进制文件。我创建了帖子数据文件的文本部分,保存,使用cat pic.jpg >> postdata,加载到Notepad ++中,并附加了最后一个边界+'-'+ EOL。W3C参考
Chloe 2013年

@Chloe,我不得不再次访问另一个项目,这一次需要二进制文件,并发现它按预期工作。我构建了一个简单的php文件上传页面,然后通过浏览器进行了操作,以首先获取文件大小,然后将其与使用wget的结果进行比较。我建议您这样做,因为错行的换行符可能会导致整个过程失败。
恢复莫妮卡·多尔(Monica-dor duh)

1
分号丢失。它导致了python tornado --header =“ Content-type:multipart / form-data; boundary = FILEUPLOAD”问题
FlappySocks
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.