1

我正在使用 resteasy 2.3.4-Final 并且在接受 multipart/form-data 的调用中遇到 UTF-8 问题。我的 API 的使用者是 iOS 和 Android 设备。发送的任何字符串参数都不包含字符集,因此 resteasy 似乎正在使用 us-ascii 编码解码字符串。我已经做了很多工作来修复从 db 层到创建一个将字符编码强制为 utf-8 的过滤器所涉及的所有其他内容。这解决了所有 form-url-encoded POST 的问题,但是现在两个调用仍然不起作用,它们都是 multipart/form-data 调用。我知道消费者应该在消息部分中发送 utf-8 字符集,但我试图弄清楚是否有' s 任何强制使用 UTF-8 暂时解码所有内容的方法,因为 Apple 需要大约 2 周的时间来批准对我们的应用程序的更新,这并不理想,但我们可能不得不在那个问题上咬紧牙关。以前有没有人这样做过并且在多部分表单上传方面取得了成功?

谢谢!

4

3 回答 3

2

根据 RESTEasy 文档,应该可以覆盖默认的内容类型:

http://docs.jboss.org/resteasy/docs/2.3.4.Final/userguide/html_single/index.html#multipart_overwrite_default_content_type

import org.jboss.resteasy.plugins.providers.multipart.InputPart;

@Provider
@ServerInterceptor
public class ContentTypeSetterPreProcessorInterceptor implements
        PreProcessInterceptor {

    public ServerResponse preProcess(HttpRequest request,
            ResourceMethod method) throws Failure, WebApplicationException {
        request.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY,
                "*/*; charset=UTF-8");
        return null;
    }

}
于 2012-06-27T07:51:42.107 回答
1

由于已弃用,我使用"injected"org.jboss.resteasy.spi.interception.PreProcessInterceptor解决了问题。javax.ws.rs.container.ContainerRequestFilterHttpServletRequest

例子:

@Provider
public class MyContentTypeFilter implements ContainerRequestFilter {
  @Context
  private HttpServletRequest servletRequest;

  @Override
  public void filter(ContainerRequestContext requestContext) throws IOException {
    servletRequest.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY, "text/plain; charset=UTF-8");
  }
}
于 2015-03-04T16:16:44.283 回答
1

这是编码问题的解决方法。也请投票给这个错误RESTEASY-390

例子:

import org.apache.james.mime4j.message.BodyPart;
import org.apache.james.mime4j.message.SingleBody;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;

    ...

@POST
@Path("/uploadContacts")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void uploadContacts(MultipartFormDataInput input) throws Exception {

    List<InputPart> inputParts = uploadForm.get("uploadFieldName");
    for (InputPart inputPart : inputParts) {
               // bytes extracted
               byte[] fileBytes = readByteArray(inputPart);
               // now we can read it with right encoding
               InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(fileBytes), "UTF-8");

               ...
    }
}

private byte[] readByteArray(InputPart inputPart) throws Exception {
    Field f = inputPart.getClass().getDeclaredField("bodyPart");
    f.setAccessible(true);
    BodyPart bodyPart = (BodyPart) f.get(inputPart);
    SingleBody body = (SingleBody)bodyPart.getBody();

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    body.writeTo(os);
    byte[] fileBytes = os.toByteArray();
    return fileBytes;
}
于 2012-09-20T12:40:28.300 回答