通过Java套接字使用HTTP协议上传文件

时间:2018-10-04 21:17:15

标签: java sockets http multipartform-data

我试图了解HTTP协议的工作原理,所以我尝试向Java Socket手动添加标头,以向httpbin.org发送请求,如下所示:

        BufferedWriter wr = new BufferedWriter(/*socket Outputstream*/)     
        wr.write("POST post HTTP/1.1\r\n");
        wr.write("Host: httpbin.org\r\n");
        wr.write("Accept: */*\r\n");
        wr.write("Content-Length: "+data.length()+"\r\n");
        wr.write("Content-Type: multipart/form-data; boundary=---WebKitFormBoundary67\r\n");
        wr.write("\r\n"); 
        wr.write(data); 
        wr.flush();

在上面的代码data中,HTTP请求的有效负载看起来完全如下:

   ---WebKitFormBoundary67
   Content-Disposition: form-data; name="field1"
   value1
   ---WebKitFormBoundary67
   Content-Disposition: form-data; name="field2"; filename="example.txt"

   Java is better when it run long
   ---WebKitFormBoundary67--

但是服务器httpbin.org不能识别附加的文件,我丢失了什么吗?

1 个答案:

答案 0 :(得分:2)

multipart/form-dataRFC 2046中定义的多部分MIME消息。 multipart/form-data邮件示例中的分段MIME邮件的基本结构如下:

Content-type:  multipart/form-data; boundary=foo

--foo
Content-Disposition: form-data; name=key1

abcde
--foo
Content-Disposition: form-data; name=key2; filename=foo.txt

01234
--foo--

如您所见,边界foo在border属性中定义,用--foo用作各部分之间的定界符,并用--foo--用作最终边界。

您的代码将边界定义为不是foo,而是定义为--foo,然后尝试仍然仅使用--foo作为零件之间的分隔符。要更正代码,您可能需要将边界设置为仅-WebKitFormBoundary67而不是---WebKitFormBoundary67,或者使用-----WebKitFormBoundary67作为分隔符而不是仅---WebKitFormBoundary67