web-dev-qa-db-ja.com

サーブレットファイルアップロードファイル名エンコーディング

標準のファイルアップロードにApacheCommonsFileuploadツールを使用しています。私の問題は、アップロードされたファイルに特殊文字(á、é、úなど)が含まれていると、それらのファイル名を正しく取得できないことです。これらはすべて?に変換されます。サイン。

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..
16
jabal

私も同じ問題を抱えていて、このように解決しました。

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 で提供されている例に基づいてコードを作成した場合は、上記の2か所でUTF-8を設定する必要があります。

14
Christoph

UTF-8もサポートするために、ターゲットコンソール/ファイル/データベース/ファイル名を印刷/書き込み/挿入する場所を確認する必要があります。疑問符は、UTF-8を受け入れるように構成されておらず、ターゲット自体がそれを認識していることを示しています。そうでなければ、あなたはただ見たでしょう mojibake

質問にはターゲットの詳細が欠けているので、舞台裏でキャラクターが何をしているのかを理解するために、 この記事 を理解することを提案する以上のことはできません。

2
BalusC

ServletFileUploadインスタンスの.setHeaderEncoding( "ISO-8858-2")を明示的に呼び出すことにより、問題を解決しました。

2
jabal

これらの特別な文字の場合、uはエンコーディングを「iso8859-1」に設定できます。 UTF-8が機能していないようです。

エンコーディングタイプを設定していない場合..LinuxマシンはUTF-8であるデフォルトのエンコーディングを採用し、Windowsは互換性のあるエンコーディングを採用します

0
asura