我使用Apache Commons Fileupload工具进行标准文件上传。我的问题是,如果上传文件包含特殊字符(á,é,ú等),我无法获得正确的文件名。它们都被转换为?迹象。
request.getCharacterEncoding()表示UTF-8,但我在字符串fileItem.getName()中得到的字节对于我的所有特殊字符都是相同的。
你能帮我解决什么问题吗?
(一些细节:在Windows上使用Firefox 3.6.12,Weblogic 10.3)
这是我的代码段:
public CommandMsg(HttpServletRequest request) {
Enumeration names = null;
if (isMultipart(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List uploadedItems = upload.parseRequest(request);
Iterator i = uploadedItems.iterator();
FileItem fileItem = null;
while (i.hasNext()) {
fileItem = (FileItem) i.next();
if (fileItem.isFormField()) {
// System.out.println("isFormField");
setAttribute(fileItem.getFieldName(), fileItem.getString());
} else {
String enc = "utf-8";
enc = request.getCharacterEncoding();
String fileName = fileItem.getName();
byte[] fnb = fileItem.getName().getBytes();
byte[] fnb2 = null;
try {
fnb2 = fileItem.getName().getBytes(enc);
String t1 = new String(fnb);
String t2 = new String(fnb2);
String t3 = new String(fnb, enc);
String t4 = new String(fnb2, enc);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
setAttribute(fileItem.getFieldName(), fileItem);
}
}
} catch (FileUploadException ex) {
ex.printStackTrace();
}
// etc..
答案 0 :(得分:12)
我有同样的问题并且像这样解决了。
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
String value = Streams.asString(stream, "UTF-8");
}
}
如果您的代码基于http://commons.apache.org/fileupload/streaming.html中提供的示例,那么您需要确保在上面的两个位置设置UTF-8。
答案 1 :(得分:2)
您需要确保目标控制台/文件/数据库/您打印/写入/插入文件名的位置也支持UTF-8。问号表明它没有配置为接受UTF-8并且目标本身也知道这一点。否则你只会看到mojibake。
由于问题中缺少有关目标的详细信息,因此除了建议让自己通过this article以了解幕后角色发生了什么外,我做的不多。
答案 2 :(得分:2)
通过显式调用ServletFileUpload实例的.setHeaderEncoding(“ISO-8858-2”)来解决问题。
答案 3 :(得分:0)
对于这些特殊字符,您可以将编码设置为“iso 8859-1”。 UTF-8似乎无法正常工作..
如果你没有设置任何编码类型..那么linux机器将采用默认编码,即UTF-8,windows将采用兼容编码