2

我正在创建一个安静的 Web 服务来处理来自用户的多个文件。从谷歌看来,正确的 mime 类型应该是多部分/混合的,所以我的 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 是“ multipart/mixed ”。但是,在我选择文件并单击发送按钮后,我的 Web 服务获取的 http 请求的 mime 类型更改为application/x-www-form-urlencoded,这会导致 Web 服务端出现“不支持的媒体类型”错误.

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

所以我的问题是,我怎样才能创建一个 html 表单,它可以发送带有 mime 类型“multipart/mixed”的 http 消息?使用这个 html,我可以测试我的网络服务。

非常感谢你。

4

3 回答 3

2

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

有关更多详细信息,请参阅此问题:enctype='multipart/form-data' 是什么意思?

于 2013-06-07T04:42:39.763 回答
0

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

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

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

该 RFC 是在 1995 年编写的,因此您希望 HTML 能够发送多个文件。这花了很长时间,但它已被添加为 HTML5的一部分,具有 multiple 属性

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

于 2014-09-02T00:23:28.047 回答
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--

从火狐:

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--
于 2015-04-07T08:43:44.597 回答