我的上传休息方法正常,除非文件名包含特殊字符:
@POST
@Consumes({ MediaType.MULTIPART_FORM_DATA })
public Response uploadFile(MultipartFormDataInput input) {
Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
List<InputPart> inputParts = uploadForm.get("file_upload");
// Do Stuff...
}
文件名为 Test.png ,inputPart.getHeaders()= [Content-Disposition = form-data; NAME = “tws_file”;文件名= “test.png”,内容 - 类型=图像/ PNG] - &GT;的确定
文件名是Döner.png,inputPart.getHeaders()= [Content-Disposition = form-data; NAME = “tws_file”;文件名= “dner.png”,内容 - 类型=图像/ PNG] - &GT; 不行
如您所见,“ö”变为“ ”。
到目前为止我尝试过的事情:
<default-encoding>UTF-8</default-encoding>
(见here)@Consumes(MediaType.MULTIPART_FORM_DATA+";charset=UTF-8");
(请参阅here)requestContext.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, "UTF-8");
更改容器请求过滤器中的编码(请参阅here)似乎没什么用。有任何想法吗 ?我正在使用Wildfly 11和Resteasy-multipart-provider 3.0.24.Final
答案 0 :(得分:0)
我最终使用了在发送文件名之前使用URI编码器手动编码文件名的解决方法。另一方面,我解码它。这样,特殊字符不再是问题。
Angular的前端:
encodeURI(fileName));
Java中的后端:
URLDecoder.decode(fileName, "UTF-8");
答案 1 :(得分:0)
添加javax.ws.rs.container.ContainerRequestFilter
为我解决了这个问题(Wildfly 11.0.0,提供Restrest):
@Provider
public class CharsetRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
requestContext.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, "UTF-8");
}
}
答案 2 :(得分:0)
该问题已在最新版本中修复:https://issues.jboss.org/browse/RESTEASY-1779