我在重复和多部分形式方面遇到麻烦,我希望有人可能遇到同样的问题或者能够帮助我。
我的目标是同时上传文件和一些参数。我使用注释为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();
}
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向两个网址发送相同的请求。这是其中之一。另一个只有网址不同。
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):
ü
有什么想法吗?我做错了还是这个错误?
先谢谢棒棒棒的stackoverflow社区。你已经得到了很大的帮助。即使这是我第一次提出问题。
答案 0 :(得分: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
输入流是org.jboss.resteasy.plugins.providers.multipart.MultipartInputImpl$ReaderBackedInputStream
(我似乎没有源代码),其中包含来自包含正确UTF的InputStreamReader
的{{1}}读数-8个字节。但是,当它被读取时,它返回错误的数据。我的ByteArrayInputStream
"nér"
(存在于缓冲区支持[110, -61, -87, 114]
中)变为in
。然后将其传递给[110, -23, 114]
,这是错误的。
我希望这对某人有帮助,除了使用我在上面问题中找到的信息之外,我没有进一步使用new String(bytes, "UTF-8")
来解决问题。谢谢你。