我正在创建一个从用户处理多个文件的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,我可以测试我的网络服务。
非常感谢你。答案 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--