使用 pojo 的 Resteasy 多部分/表单数据编码

ber*_*ert 5 multipartform-data resteasy

我在使用 resteasy 和 multipart 表单时遇到了麻烦,我希望有人可能有同样的问题,或者能够帮助我。

我的目标是同时上传一个文件和一些参数。我使用注释到 POJO-Form 的 @MultipartForm 尝试了这个:

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除了字符编码被破坏。如果我使用变音,它不会正确返回。而如果我使用以下方法:

@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";
}
Run Code Online (Sandbox Code Playgroud)

我已经使用 charlesproxy 向两个 url 发送相同的请求。这是其中之一。另一个仅在 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--
Run Code Online (Sandbox Code Playgroud)

响应 1(使用 pojo 表单):

?
Run Code Online (Sandbox Code Playgroud)

响应 2(使用 MultipartFormDataInput):

ü
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我做错了什么还是这是一个错误?

提前感谢很棒的 stackoverflow 社区。你已经帮了大忙了。即使这是我第一次提问。

ein*_*nus 3

我有同样的问题。\n我已经逐步执行了 Resteasy 代码,发现问题出现在org.jboss.resteasy.plugins.providers.ProviderHelper.readString(InputStream, MediaType).

\n\n
public static String readString(InputStream in, MediaType mediaType) throws IOException\n{\n  byte[] buffer = new byte[1024];\n  ByteArrayOutputStream builder = new ByteArrayOutputStream();\n  int wasRead = 0;\n  do\n  {\n     wasRead = in.read(buffer, 0, 1024);\n     if (wasRead > 0)\n     {\n        builder.write(buffer, 0, wasRead);\n     }\n  }\n  while (wasRead > -1);\n  byte[] bytes = builder.toByteArray();\n\n  String charset = mediaType.getParameters().get("charset");\n  if (charset != null) return new String(bytes, charset);\n  else return new String(bytes, "UTF-8");\n}   \n
Run Code Online (Sandbox Code Playgroud)\n\n

输入in流是一个org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$ReaderBackedInputStream(我似乎没有源代码),其中包含InputStreamReader来自ByteArrayInputStream包含正确UTF-8字节的读取。然而,当它被读取时,它返回错误的数据。My "n\xc3\xa9r" [110, -61, -87, 114](存在于缓冲区支持中in)变为[110, -23, 114]。然后将其传递给new String(bytes, "UTF-8")错误的位置。

\n\n

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

\n