使用 RestEasy 和 Wildfly 11 的 MultipartFormDataInput 中的文件名编码错误

Filename encoding is wrong in MultipartFormDataInput with RestEasy and Wildfly 11

我的上传 rest 方法工作正常除非文件名包含特殊字符:

@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;姓名="tws_file";文件名="test.png",内容类型=image/png] --> 确定

文件名为Döner.png, inputPart.getHeaders() = [Content-Disposition=form-data;姓名="tws_file";文件名="d��ner.png",内容类型=image/png] --> 不行

如您所见,“ö”变成了“��”。

到目前为止我尝试过的事情:

似乎没有任何效果。有任何想法吗 ?我正在使用 Wildfly 11 和 Resteasy-multipart-provider 3.0.24.Final

我最终使用了在发送文件名之前手动使用 URI 编码器对文件名进行编码的解决方法。另一方面,我解码它。这样,特殊字符就不再是问题了。

Angular 中的前端:

encodeURI(fileName));

Java 中的后端:

URLDecoder.decode(fileName, "UTF-8");

添加 javax.ws.rs.container.ContainerRequestFilter 为我解决了这个问题(Wildfly 11.0.0,Resteasy 提供):

@Provider 
public class CharsetRequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, "UTF-8");
    }

}

问题已在最新版本中修复:https://issues.jboss.org/browse/RESTEASY-1779