如何通过 curl --binary-data 和 webkit 表单边界上传文件?
How to upload a file via curl --binary-data and webkit form boundary?
有一个内容系统,我想为其自动上传文件。
当我手动上传文件时,浏览器恰好执行 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 ?
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;
header,curl 将添加它,并设置适当的边界,否则您将设置错误的边界(如果您手动设置 header, curl 不会覆盖您的自定义 header,但如果您不设置它,curl 会为您创建它。)
有一个内容系统,我想为其自动上传文件。 当我手动上传文件时,浏览器恰好执行 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 ?
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;
header,curl 将添加它,并设置适当的边界,否则您将设置错误的边界(如果您手动设置 header, curl 不会覆盖您的自定义 header,但如果您不设置它,curl 会为您创建它。)