如何创建一个html表单来发送带有multipart / mixed mime类型的http消息

时间:2013-06-07 04:35:24

标签: html web-services jersey mime-types multipartform-data

我正在创建一个从用户处理多个文件的restful Web服务。从谷歌似乎正确的mime类型应该是multipart / mixed所以我的java web服务代码(基于Jersey)是这样的:

@POST
@Consumes(MultiPartMediaTypes.MULTIPART_MIXED)
@Produces({
    MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON
})
@Path("/{Id}")
public CourseBean updateCourse(@PathParam("Id") final String id, final MultiPart multipart)
    throws WebServiceException
{
    //operations on multipart
    String this.id = id;
    return null;
}

在浏览器中,我在html下面运行以尝试将文件上传到Web服务:          

<h1></h1>

<p>files</p>
<FORM action="http://localhost:8080/rest/1"
       enctype="multipart/mixed"
       method="POST">
<p>
   name:<INPUT type="text" name="submit-name"><BR>
   file <INPUT type="file" name="file"><BR>
   attachment <INPUT type="file" name="attachment"><BR>
   <INPUT type="submit" value="Send"> <INPUT type="reset">
 </FORM>

</body>
</html>

请注意,此处的enctype为&#34; multipart / mixed &#34;。然而,在我选择文件并单击发送按钮后,我的Web服务获取的http请求的mime类型将更改为 application / x-www-form-urlencoded ,这会导致&#34;不支持的媒体类型&#34; Web服务端出错。

但如果我将html中的enctype更改为 multipart / form-data ,则收到的请求的mime类型是相同的: multipart / form-data

所以我的问题是,如何创建一个可以发送带有mime类型的&#34; multipart / mixed&#34;的http消息的html表单?使用这个html,我可以测试我的网络服务。

非常感谢你。

3 个答案:

答案 0 :(得分:1)

HTML表单不支持以multipart/mixed方式发送数据。它们最接近,你可能想要使用的是multipart/form-data。如果您的REST网络服务只能接受multipart/mixed,那么您将无法直接从HTML表单中调用它。

有关详细信息,请参阅此问题:What does enctype='multipart/form-data' mean?

答案 1 :(得分:0)

HTML表单始终使用multipart / form-data作为编码。这是一种在一个流中发送多个数据块的方法。每个块都有自己的标题(这是“多部分”功能)。网页将始终为表单中的每个“成功”元素发送一个这样的块,这实际上意味着所有带有内容的元素和单击的提交按钮。

根据定义&lt; input type =“file”&gt;的RFC1867,文件可以通过两种方式发送:当发送单个文件时,它本身就是流中的一部分。当发送多个文件时,它们被打包为multipart / form-data中的multipart / mixed块:POST请求仍然具有multipart / form-data类型,但在其中,其中一个部分是multipart / mixed类型

请注意,只有在从单个输入元素发送多个文件时才会发生这种情况。如果有多个输入元素,它们将作为自己的块发送,并且不会创建嵌套的多部分流。

RFC是在1995年编写的,因此您希望HTML能够发送多个文件。这需要很长时间,但它已作为HTML5的一部分添加the multiple attribute

但是,当前的浏览器实现不使用RFC中描述的方法。相反,他们将发送具有相同名称的多个字段。换句话说,浏览器永远不会生成多部分/混合字段。

答案 2 :(得分:0)

这是具有多文件浏览控件的请求:

采样form.html:

  <form action="http://localhost:1234" method="post" enctype="multipart/form-data">
    <p><input type="text" name="message" value="Hello World">
    <p><input type="file" name="images" multiple>
    <p><button type="submit">Submit</button>
  </form>

这是服务器从Safari获取的内容:

POST / HTTP/1.1

主机:

POST / HTTP/1.1
Host: localhost:1234
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryN8Y1MQiNiQs7fEEd
Origin: file://
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.4.10 (KHTML, like Gecko) Version/7.1.4 Safari/537.85.13
Content-Length: 527
Accept-Language: en-us
Accept-Encoding: gzip, deflate

------WebKitFormBoundaryN8Y1MQiNiQs7fEEd
Content-Disposition: form-data; name="message"

Hello World
------WebKitFormBoundaryN8Y1MQiNiQs7fEEd
Content-Disposition: form-data; name="images"; filename="testfile1.txt"
Content-Type: text/plain

Hello World, no trailling newlines
------WebKitFormBoundaryN8Y1MQiNiQs7fEEd
Content-Disposition: form-data; name="images"; filename="testfile2.txt"
Content-Type: text/plain

Hello world, with TWO newlines at the end (NOT CRLF)


------WebKitFormBoundaryN8Y1MQiNiQs7fEEd--

来自Firefox:

POST / HTTP/1.1
Host: localhost:1234
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:37.0) Gecko/20100101 Firefox/37.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
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------16701619336528579941090352635
Content-Length: 599

-----------------------------16701619336528579941090352635
Content-Disposition: form-data; name="message"

Hello World
-----------------------------16701619336528579941090352635
Content-Disposition: form-data; name="images"; filename="testfile1.txt"
Content-Type: text/plain

Hello World, no trailling newlines
-----------------------------16701619336528579941090352635
Content-Disposition: form-data; name="images"; filename="testfile2.txt"
Content-Type: text/plain

Hello world, with TWO newlines at the end (NOT CRLF)


-----------------------------16701619336528579941090352635--