我在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)
变化:接受编码
我希望它可以帮助你帮助我找到解决方案。
答案 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();