我使用下一代码进行文件上传:
@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字符串的编码和编码数据?
答案 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_" />