2012-03-18 60 views
4

我遇到了resteasy和multipart表单的问题,我希望有人可能会遇到同样的问题或者能够帮助我。使用pojo的Resteasy多部分/表单数据编码

我的目标是同时上传文件和一些参数。我试图用这个注释的POJO表格的@MultipartForm:

@PUT 
@Path("/userdebug1/{userId}") 
@Consumes("multipart/form-data") 
@Produces("application/json;charset=UTF-8") 
public String updateUserDebug1(@MultipartForm UserRequestForm request) 
{ 
    return request.getName(); 
} 

随着UserRequestForm形式存在:

public class UserRequestForm 
{ 
    @FormParam("name") 
    String name; 

    @FormParam("blob") 
    @PartType("application/octet-stream") 
    byte[] image; 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String n) 
    { 
     this.name =n; 
    } 

    public byte[] getImage() 
    { 
     return image; 
    } 

    public void setImage(byte[] image) 
    { 
     this.image = image; 
    } 
} 

这一切运作良好,除了事实的字符编码被打破 。如果我使用变音符号,则无法正确返回。而如果我使用以下方法:

@PUT 
@Path("/userdebug2/{userId}") 
@Consumes("multipart/form-data") 
@Produces("application/json;charset=UTF-8") 
public String updateUserDebug2(MultipartFormDataInput form) 
{ 
    try { 
     return form.getFormDataMap().get("name").get(0).getBodyAsString(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return "error"; 
} 

我已经使用charlesproxy发送相同的请求两个网址。这是其中之一。另一个只有url不同。

PUT /api/v1/userdebug1/A4BE364C-15F8-59B0-87C3-DCA0A123644A HTTP/1.1 
Host: localhost:8081 
Content-Type: multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-5C999EAA-3828-4919-98B7-19D4FD738814 
Accept-Encoding: gzip 
Connection: close 
Content-Length: 205 

--0xKhTmLbOuNdArY-5C999EAA-3828-4919-98B7-19D4FD738814 
Content-Disposition: form-data; name="name" 
Content-Type: text/plain;charset=utf-8 

ü 
--0xKhTmLbOuNdArY-5C999EAA-3828-4919-98B7-19D4FD738814-- 

响应1(使用POJO形式):

响应2(使用MultipartFormDataInput):

ü 

任何想法?我做错了什么或者这是一个错误?

预先感谢您真棒的计算器。你已经有了很大的帮助。即使这是我第一次问一个问题。

+0

我已经升级到2.3.5.Final并在那里固定。 – bert 2012-12-03 19:00:15

回答

2

我遇到同样的问题。 我已经通过了resteasy代码,发现问题出现在org.jboss.resteasy.plugins.providers.ProviderHelper.readString(InputStream, MediaType)

public static String readString(InputStream in, MediaType mediaType) throws IOException 
{ 
    byte[] buffer = new byte[1024]; 
    ByteArrayOutputStream builder = new ByteArrayOutputStream(); 
    int wasRead = 0; 
    do 
    { 
    wasRead = in.read(buffer, 0, 1024); 
    if (wasRead > 0) 
    { 
     builder.write(buffer, 0, wasRead); 
    } 
    } 
    while (wasRead > -1); 
    byte[] bytes = builder.toByteArray(); 

    String charset = mediaType.getParameters().get("charset"); 
    if (charset != null) return new String(bytes, charset); 
    else return new String(bytes, "UTF-8"); 
} 

in的输入流是包含一个InputStreamReaderByteArrayInputStream读取包含正确的UTF-8字节org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$ReaderBackedInputStream(我不似乎具有用于源代码)。但是,读取时会返回错误的数据。我的"nér"[110, -61, -87, 114](存在于缓冲区后台in中)变为[110, -23, 114]。然后传给new String(bytes, "UTF-8")这是错误的。

我希望这可以帮助别人,除了通过使用我在上面问题中找到的信息,我没有得到任何进一步通过使用form.getFormDataMap().get("name").get(0).getBodyAsString()破解问题。谢谢你。

相关问题