带有法语字符的文件名当作为多部分表单数据发送到Web服务时更改

时间:2016-02-03 06:42:17

标签: java rest encoding multipartform-data

我在java中有一个REST Web服务,它将输入作为多部分表单数据:

@POST
@Consumes ({MediaProviderJSON.TYPE,MediaType.APPLICATION_FORM_URLENCODED,MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,"text/html",MediaType.MULTIPART_FORM_DATA})
@Produces({ text_html, MediaProviderJSON.TYPE })
@Path("/tempUpload")
public Response tempUpload(@Context HttpServletRequest req, @Context HttpServletResponse response)
.
.
// configures upload settings
DiskFileItemFactory factory = new DiskFileItemFactory();
// sets memory threshold - beyond which files are stored in disk
factory.setSizeThreshold(MEMORY_THRESHOLD);
// sets temporary location to store files
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> formItems = upload.parseRequest(req);
FileItem item = formItems.get(0);
String fileName = item.getName();
System.out.println(fileName);
.
.
.

我正在尝试使用此HTML上传文件:

    <html>
<head></head>
<body>
    <form action= "http://localhost:8080/mywebapp/services/tempUpload" method="POST" enctype="multipart/form-data">
        <input type="file" name="attachments">
        <input type="submit">
    </form>
</body>

当我上传文件名为français的文件时,我在控制台上输出fran ais

我不明白它是否是编码的变化,或者名称实际上已被破坏。

有人可以帮忙吗?我需要控制台上的实际文件名。

我认为这是一个编码问题所以尝试使用以下代码转换文件名:

byte[] nameBytes = fileName.getBytes("iso-8859-1");
fileName = new String(nameBytes, "UTF-8"); 

没有用。

编辑:

以上HTML只是我的网络应用的一个示例。我的应用程序部署在不同的服务器上。当我从一台服务器调用此服务时,我得到了正确的结果,而在另一台服务器上,我收到了损坏的数据。服务器的详细信息是:

server1(正确o / p):

  

请求标题:

接受:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp, / ; q = 0.8
  接受编码:gzip,紧缩,SDCH
  接受语言:EN-US,EN; Q = 0.8
  连接:保持活跃
  内容长度:443
  内容类型:多部分/格式数据;边界= ---- WebKitFormBoundary6aYJSRYJByguER4s

     

响应标头

  连接:保持活动
  内容编码:gzip
  内容长度:142
  内容类型:text / html的
  保持活跃:超时= 5,最大= 100
  服务器:nginx / 0.5.14
  变化:接受编码

server2(错误的o / p):

  

请求标题:

接受: /
  接受编码:gzip,紧缩,SDCH
  接受语言:EN-US,EN; Q = 0.8
  连接:保持活跃
  内容长度:206
  内容类型:多部分/格式数据;边界= ---- WebKitFormBoundaryyfnGQAtMhC4buFRS

     

内容类型,接受   连接:保持活动
  内容编码:gzip
  内容长度:152
  内容类型:应用程序/ JSON
  保持活跃:超时= 5,最大= 99
  服务器:Apache / 2.4.10(Unix)
  变化:接受编码

我希望它可以帮助你帮助我找到解决方案。

1 个答案:

答案 0 :(得分:1)

您是否在Tomcat上部署应用程序?如果是这样,您可以声明应用程序上下文的字符编码。它应该与您在html页面上声明为字符编码的内容相匹配。您在问题中给出的示例缺少字符编码声明。

要更改应用程序上下文的字符编码,请编辑以下片段中的META-INF / context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context URIEncoding="UTF-8" path="">
</Context>

如果一切配置正确(页面包含字符编码信息,在context.xml中声明相同的字符编码),上面给出的代码片段应该可以正常工作:

FileItem item = formItems.get(0);
String fileName = item.getName();