resteasy上传文件中文乱码解决

系统用的是resteasy架构的rest框架,有一个表单提交,需要上传一张图片和提交一些文本信息,文本信息有中文,但是中文一直出现乱码,页面和后台编码都是UTF-8,纠结半天,终于解决

  @POST
  @Path("picture")
  @Consumes(MediaType.MULTIPART_FORM_DATA)
  public void savePicture(MultipartFormDataInput formDataInput) {
    try {
      Map<String, List<InputPart>> uploadForm = formDataInput.getFormDataMap();//提交的form表单
      List<InputPart> inputParts = uploadForm.get("image");
      //处理图片的操作省略
      InputPart titleinputParts = uploadForm.get("title").get(0);
      titleinputParts.setMediaType(MediaType.TEXT_PLAIN_TYPE);
      String title = titleinputParts.getBodyAsString();
} catch (Exception e1) {
      logger.info("出错");
      logger.info(e1);
} finally {
      logger.info("结束");
}

在获取字符串之前要把mediatype改掉 即:
titleinputParts.setMediaType(MediaType.TEXT_PLAIN_TYPE);

### 使用 MultipartFormDataInput 的方法 `MultipartFormDataInput` 是 Java EE 中用于处理多部分表单数据输入的一个接口。它通常被用来解析 HTTP 请求中的文件上传或其他复杂的数据结构[^1]。 #### 接口定义 该接口位于 `javax.servlet.http.Part` 和其他相关类之间,主要用于接收并解析 multipart/form-data 类型的请求体。开发者可以通过此接口获取上传文件以及相关的元数据。 ```java import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; ``` #### 基本用法 以下是通过 RESTEasy 实现 `MultipartFormDataInput` 处理文件上传的例子: ```java @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile(MultipartFormDataInput input) { Map<String, List<InputPart>> formDataMap = input.getFormData(); // 获取所有的 form 数据 for (String key : formDataMap.keySet()) { // 遍历键值对 List<InputPart> inputParts = formDataMap.get(key); for (InputPart inputPart : inputParts) { try { MultivaluedMap<String, String> headers = inputPart.getHeaders(); String fileName = getFileName(headers); // 提取文件名 InputStream inputStream = inputPart.getBody(InputStream.class, null); // 转换为流 byte[] bytes = IOUtils.toByteArray(inputStream); Files.write(Paths.get("/path/to/save/" + fileName), bytes); // 将字节写入磁盘 } catch (IOException e) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build(); } } } return Response.ok("File uploaded successfully").build(); } private static String getFileName(MultivaluedMap<String, String> headers) { String contentDisposition = headers.getFirst("Content-Disposition"); String[] items = contentDisposition.split(";"); for (String item : items) { if (item.trim().startsWith("filename")) { return item.substring(item.indexOf("=") + 2, item.length() - 1); } } return ""; } ``` 上述代码展示了如何利用 `MultipartFormDataInput` 来读取和保存上传文件[^2]。 --- ### 常见问题及解决方案 1. **无法正确解析 multipart 表单** 如果遇到无法解析 multipart 表单的情况,请确认客户端发送的内容类型是否设置为 `multipart/form-data` 并且边界参数(boundary)已正确定义[^3]。 2. **大文件上传失败** 对于较大的文件上传操作,可能会因为服务器配置限制而失败。可以调整应用服务器的最大上传大小限制,例如在 Tomcat 中修改 `web.xml` 文件中的 `<max-file-size>` 参数[^4]。 3. **字符编码错误** 当接收到的字段包含特殊字符时,可能因编码不一致而导致乱码现象。建议统一设定 UTF-8 编码作为默认选项,并确保前端与后端保持一致性[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值