2012-03-18 12 views
4

私はresteasyとmultipartフォームに問題があり、誰かが同じ問題を抱えているか、そうでなければ私を助けてくれることを望んでいました。ポーホーを使用したマルチパート/フォームデータの再エンコード

私の目標は、ファイルといくつかのパラメータを同時にアップロードすることです。このすべては、文字エンコーディングをを破られという事実を除いて、うまく機能

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; 
    } 
} 

:UserRequestFormフォームされた状態で

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

:私は、これはPOJOフォームに注釈付き@MultipartFormを使用してみました。ウムラウトを使用すると、正しく戻されません。一方、次の方法を使用する場合:

@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を同じリクエストで送信しています。ここにその一つがあります。もう1つは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-- 

(POJOのフォームを使用して)応答1:(MultipartFormDataInputを使用して)

レスポンス2:

ü 

任意のアイデア?私は何か間違っているのですか?これはバグですか?

ありがとうございました。素晴らしいstackoverflowコミュニティ。あなたはすでに大きな助けになっています。これが初めての場合でも私は質問をしました。

+0

私は2.3.5にアップグレードしました。最終的には固定されています。 – bert

答えて

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入力ストリームが正しいUTF-8バイトを含むByteArrayInputStreamから読み出しInputStreamReaderを含有する(Iは、ソースコードを持っているように見えるいけない)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()を使用してこの問題をハックする以外は、これが誰かに役立つことを願っています。有難うございます。

関連する問題