Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过java套接字使用HTTP协议上传文件_Java_Sockets_Http_Multipartform Data - Fatal编程技术网

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

通过java套接字使用HTTP协议上传文件,java,sockets,http,multipartform-data,Java,Sockets,Http,Multipartform Data,我试图理解HTTP协议是如何工作的,所以我尝试手动将头添加到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

我试图理解HTTP协议是如何工作的,所以我尝试手动将头添加到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没有识别任何附加的文件,我丢失了什么吗?

多部分/表单数据
是中定义的多部分MIME消息。
多部分/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
在边界属性中定义,用作带有
--foo
的零件之间的分隔符,并用作最终边界
--foo-->


您的代码不是将边界定义为
foo
,而是定义为
--foo
,然后仍尝试仅使用
--foo
作为零件之间的分隔符。要更正代码,您需要将边界设置为仅
-WebKitFormBoundary67
,而不是
--WebKitFormBoundary67
,或者使用
--WebKitFormBoundary67
作为分隔符,而不是仅
--WebKitFormBoundary67
,谢谢,我意识到,我只需在有效负载中的分隔符之前给出
-
来分隔参数。此外,在显示的原始
数据中,
字段1
的MIME头和MIME正文之间缺少一条空行,就像
字段2
中存在一条空行一样。这意味着
value1
被视为
field1
的未知MIME头,而不是它的文本值我不知道这是如何显示http协议的工作原理的?只是任意的服务器配置等和首选项?@Marshallcraft我认为这是典型的浏览器在网页中提交带有文件上载的表单时所做的。协议只是一套规则,两个系统同意在没有任何麻烦的情况下进行通信。上面的问题试图遵循中定义的规则,所以任何HTTP服务器都可以识别我发送给它的信息类型。由于我未能正确遵循约定,目标服务器无法识别我正试图发送的数据。