多部分/表单数据的例子

我想知道是否有人可以与我分享一个multipart / form-data的例子,其中包含:

  1. 一些表单参数
  2. 多个文件

编辑 :我正在维护一个类似的,但更深入的答案在: https : //stackoverflow.com/a/28380690/895245

要准确查看发生了什么,请使用nc -l或ECHO服务器以及浏览器或cURL等用户代理。

将表单保存到.html文件中:

 <form action="http://localhost:8000" method="post" enctype="multipart/form-data"> <p><input type="text" name="text" value="text default"> <p><input type="file" name="file1"> <p><input type="file" name="file2"> <p><button type="submit">Submit</button> </form> 

创build要上传的文件:

 echo 'Content of a.txt.' > a.txt echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html 

跑:

 nc -l localhost 8000 

在浏览器中打开HTML,select文件并点击提交,然后检查terminal。

nc打印收到的请求。 火狐发送:

 POST / HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET Connection: keep-alive Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 Content-Length: 554 -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name="text" text default -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name="file1"; filename="a.txt" Content-Type: text/plain Content of a.txt. -----------------------------9051914041544843365972754266 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html><title>Content of a.html.</title> -----------------------------9051914041544843365972754266-- 

或者,cURL应该发送与浏览器表单相同的POST请求:

 nc -l localhost 8000 curl -F "text=default" -F "file1=@a.html" -F "file1=@a.txt" localhost:8000 

您可以使用以下方式进行多项测

 while true; do printf '' | nc -l localhost 8000; done 

非常感谢@Ciro Santilli的回答! 我发现他对边界的select是相当“不高兴”的,因为所有的连字符都是这样的:事实上,正如@Fake Name所说,当你在请求中使用你的边界时,它前面会出现两个连字符:

例:

 POST / HTTP/1.1 HOST: host.example.com Cookie: some_cookies... Connection: Keep-Alive Content-Type: multipart/form-data; boundary=12345 --12345 Content-Disposition: form/data; name="sometext" some text that you wrote in your html form ... --12345 Content-Disposition: form/data; name="name_of_post_request" filename="filename.xyz" content of filename.xyz that you upload in your form with input[type=file] --12345 Content-Disposition: form/data; name="image" filename="picture_of_sunset.jpg" content of picture_of_sunset.jpg ... --12345-- 

我在这个w3.org网页上发现,可以在多部分/表单数据中封装多部分/混合标题,只需在多部分/混合部分中select另一个边界string,然后使用该string来封装数据。 最后,您必须“closures”在FILO命令中使用的所有边界来closuresPOST请求(如:

 POST / HTTP/1.1 ... Content-Type: multipart/form-data; boundary=12345 --12345 Content-Disposition: form/data; name="sometext" some text sent via post... --12345 Content-Disposition: form/data; name="files" Content-Type: multipart/mixed; boundary=abcde --abcde Content-Disposition: file; file="picture.jpg" content of jpg... --abcde Content-Disposition: file; file="test.py" content of test.py file .... --abcde-- --12345-- 

看看上面的链接。