通过 java 套接字使用 HTTP 协议上传文件
File Upload using HTTP protocol through java socket
我想了解 HTTP 协议是如何工作的,所以我尝试手动将 headers 添加到 java 套接字以向 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 没有识别任何附加文件,我是不是遗漏了什么?
multipart/form-data
是 RFC 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
在 boundary 属性中定义,用作 --foo
部分之间的分隔符,并用作最终边界 --foo--
.
您的代码不是将边界定义为 foo
,而是定义为 --foo
,然后尝试仅使用 --foo
作为各部分之间的分隔符。要更正您的代码,您需要将边界设置为仅 -WebKitFormBoundary67
而不是 ---WebKitFormBoundary67
,或者使用 -----WebKitFormBoundary67
作为分隔符而不是仅 ---WebKitFormBoundary67
.
我想了解 HTTP 协议是如何工作的,所以我尝试手动将 headers 添加到 java 套接字以向 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 没有识别任何附加文件,我是不是遗漏了什么?
multipart/form-data
是 RFC 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
在 boundary 属性中定义,用作 --foo
部分之间的分隔符,并用作最终边界 --foo--
.
您的代码不是将边界定义为 foo
,而是定义为 --foo
,然后尝试仅使用 --foo
作为各部分之间的分隔符。要更正您的代码,您需要将边界设置为仅 -WebKitFormBoundary67
而不是 ---WebKitFormBoundary67
,或者使用 -----WebKitFormBoundary67
作为分隔符而不是仅 ---WebKitFormBoundary67
.