问题描述
我正在使用Apache Commons Fileupload工具进行标准文件上传.我的问题是,如果上传的文件包含特殊字符(á,é,ú等),我将无法获得正确的文件名.迹象.
I am using the Apache Commons Fileupload tools for standard file upload. My problem is that I cannot get the proper filename of uploaded files if they contain special characters (á, é, ú, etc.) They all get converted to ? signs.
request.getCharacterEncoding()表示UTF-8,但是我在字符串fileItem.getName()中获得的字节对于我所有的特殊字符都是相同的.
request.getCharacterEncoding() says UTF-8, but the bytes I get in the string fileItem.getName() are all the same for all my special characters.
你能帮我怎么回事吗?
(某些详细信息:在Windows上使用Firefox 3.6.12和Weblogic 10.3)
(Some details: using Firefox 3.6.12, Weblogic 10.3 on Windows)
这是我的代码段:
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..
推荐答案
我遇到了同样的问题,并像这样解决了它.
I had the same problem and solved it like this.
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.
If you based your code on the example provided in http://commons.apache.org/fileupload/streaming.html then you need to make sure you set UTF-8 in two places above.
这篇关于servlet文件上传文件名编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!