RestEasy文件上传 - 如何正确确定文件名编码?

时间:2014-07-14 06:44:20

标签: java encoding resteasy multipartform-data

我使用下一代码进行文件上传:

@Path("/files/")
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public OrderData uploadFile(MultipartFormDataInput input) {
    List<InputPart> parameterParts = input.getFormDataMap().get("Filename");
    String filename = parameterParts.get(0).getBody(String.class, null);
    ...
}

拉丁字符可以正常使用,但我有西里尔字母的问题 (据我所知,因为Java默认将rawpost数据编码为unicode)

如何正确地确定从post到有效Java字符串的编码和编码数据?

1 个答案:

答案 0 :(得分:3)

使用multipart/form-data时,您可以为每个部分指定包含编码的内容类型:

POST /some-resource HTTP/1.1
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="file"; filename="file1.txt"
Content-Type: text/plain; charset=utf-8

... contents of file1.txt ...
--AaB03x--

如果为每个部分添加此Content-Type,它应该开箱即用(至少对于RESTeasy的当前版本3.0.x)。您可以使用RESTeasy客户端对此进行测试:

WebTarget target = client.target("/some-resource");
MultipartFormDataOutput formData = new MultipartFormDataOutput();
formData.addFormData("file", fileContent, MediaType.TEXT_PLAIN_TYPE.withCharset("utf-8"));
Entity<MultipartFormDataOutput> entity = Entity.entity(formData, MediaType.MULTIPART_FORM_DATA);
Response response = target.request().post(entity);

如果您的客户端不允许您为每个部分设置内容类型,则可以change the default encoding取决于自定义标头(我添加修改后的代码示例,因为{{1}标记为PreProcessInterceptor):

@deprecated

如果您使用的是纯HTML表单,则可以尝试将@Provider public class CharsetFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { String charset = requestContext.getHeaderString("X-Charset"); if (charset != null) { requestContext.setProperty(InputPart.DEFAULT_CHARSET_PROPERTY, charset); } } } 添加到表单中。如multipart/form-data encoding algorithm中所定义,客户端应使用他正在使用的字符集填充此字段。然后,您需要自己对ResourceClass中的内容进行编码:

<input type="hidden" name="_charset_" />