通过RESTful CXF使用multipart / form-data

时间:2013-03-07 12:43:48

标签: java rest cxf jackson multipartform-data

我一直在使用Apache服务器与Jackson一起使用和生成JSON文件的web服务。
但是,其中一个服务的方法应该能够从一个移动应用程序保存上传的图像,该应用程序向我的web服务发出多部分/表单数据POST请求,我不知道如何处理这种内容-type在我的上下文中。我们通常创建“Request”和“Response”对象来使用和生成JSON,但是,我担心这不适用于这种情况。

这是请求格式:

Content-type: multipart/form-data
"Description": text/plain
"Path": text/plain
"Image": image/jpeg

如何正确使用此类请求并保存图像服务器端?


[编辑]

我设法使用以下方法来使用multipart / form-data:

public returnType savePicture(
                @Multipart(value = "mode", type = "text/plain") String mode,
                @Multipart(value = "type", type = "text/plain") String type,
                @Multipart(value = "path", type = "text/plain") String path
                @Multipart(value = "image", type = "image/jpeg") Attachment image
            ) 
    {

但是,在尝试使用以下POST请求时:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="mode"

T
--AaB03x
content-disposition: form-data; name="type"

M
--AaB03x
content-disposition: form-data; name="path"

c:/img/
--AaB03x
content-disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary

imgdata
--AaB03x--

我收到以下错误:

  

javax.ws.rs.BadRequestException:org.apache.cxf.jaxrs.utils.multipart.MultipartReadException:找不到内容ID 类型的多部分,请求内容类型:multipart / form-data;边界= AaB03x

例如,当我仅使用模式时,它可以正常工作。它只会中断2个或更多参数。任何想法都是错的?

3 个答案:

答案 0 :(得分:1)

我在某个时候遇到了类似的问题。

以下代码为我做了诀窍

@POST
@Consumes("multipart/form-data")
public void yourMethod(<params>) throws Exception {
}

简而言之,我认为您缺少@Consumes注释。

答案 1 :(得分:0)

似乎我们发现了问题,它与请求的格式有关。正确的格式应该是:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="mode"

T--AaB03x

content-disposition: form-data; name="type"

M--AaB03x

content-disposition: form-data; name="path"

c:/img/--AaB03x

content-disposition: form-data; name="image"; filename="image.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: binary

imgdata--AaB03x--

更改为此格式允许我使用其他参数。

答案 2 :(得分:0)

用于使用多部分表单数据。使用@consumes标签&amp;提供&#34; multipart / form-data&#34;以及

之类的值参数

@Consumes(value =&#34; multipart / form-data&#34;)

https://jnorthr.wordpress.com/2012/07/10/http-header-content-type-and-encodings/