servlet 文件上载文件名编码

我正在使用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..

答案 1

我有同样的问题,并像这样解决它。

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。


答案 2

您需要确保目标控制台/文件/数据库/任何要打印/写入/插入文件名的位置也支持 UTF-8。问号表示它未配置为接受 UTF-8,并且目标本身也知道这一点。否则你只会看到莫吉巴克

由于问题中缺少有关目标的详细信息,因此除了建议自己阅读本文以了解幕后角色的情况之外,我无能为力。


推荐