如何通过curl --binary-data和webkit表单边界上传文件?

时间:2018-07-23 17:07:33

标签: bash curl post binary-data

有一个我要自动上传文件的内容系统。 当我手动上传文件时,浏览器将完全执行1个POST请求:

 curl 'http://servers-ip-address/webtest/vmweb'
 -H 'Origin: http://servers-ip-address'
 -H 'Accept-Encoding: gzip, deflate'
 -H 'Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7'
 -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
 -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYdSASYyCSQjGlu54'
 -H 'Accept: */*' -H 'Referer: http://servers-ip-address/webtest/vmsf/1531725119/client/A78837FE722B13434138152B7DCC947C.cache.html'
 -H 'Cookie: LASTUSERNAME=myusername; LASTUSERDOMAIN=""; JSESSIONID=mysessionid; XSRF-TOKEN=myxsrftoken; GLog=%7B%0D%20%20%20%20trackRPC%3Afalse%0D%7D'
 -H 'Connection: keep-alive'
 --data-binary $'------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="upload_file"; filename="abcd.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="task"\r\n\r\nbov\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xst"\r\n\r\ntmvattachaddfiledrop\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="windowid"\r\n\r\n56\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xcpwinid"\r\n\r\n57\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="actionmoniker"\r\n\r\nde..metamodel.LinkRelationAction-1337#\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xsrftoken"\r\n\r\nmyxsrftoken\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54--\r\n'
 --compressed

当我执行该curl语句时,服务器接受请求并在系统上显示文件。不幸的是,文件为空。

尝试的解决方案: 我假设我必须使用@字符来引用文件。但是根据文档,@之后的所有内容都必须是文件名。现在,如果我将--data-binary拆分为多个语句

--data-binary $'------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="upload_file"; '
--data-binary 'filename=@abcd.png'
--data-binary '\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="task"\r\n\r\nbov\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xst"\r\n\r\ntmvattachaddfiledrop\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="windowid"\r\n\r\n56\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xcpwinid"\r\n\r\n57\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="actionmoniker"\r\n\r\nde..metamodel.LinkRelationAction-1337#\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54\r\nContent-Disposition: form-data; name="xsrftoken"\r\n\r\nmyxsrftoken\r\n------WebKitFormBoundaryYdSASYyCSQjGlu54--\r\n'

它将无法正常工作,因为curl将&字符与语句连接起来

如何将文件(或正确的引用)放入--data-binary?

1 个答案:

答案 0 :(得分:0)

hoo lee sheet,几乎没有任何理由手动处理multipart / form-data请求,请停止这样做。您可以使用-F参数

-F upload_file=@abcd.png -F task=bov -F xst=tmvattachaddfiledrop -F windowid=56 -F xcpwinid=57 -F actionmoniker='de..metamodel.LinkRelationAction-1337#' -F xsrftoken=myxsrftoken,然后curl将为您创建multipart / form-data内容。

还要删除Content-Type: multipart/form-data;标头,curl将添加它,并设置适当的边界,而您将设置错误的边界(如果您手动设置标头,curl不会覆盖您的自定义标头,但是如果您未设置,curl会为您创建它。)