1

私のウェブサイトでは、ユーザーがリモートサーバーにファイルをアップロードできます。サーバー上のファイル名の問題を回避するために、サーバーにアップロードされたファイルに名前を付けるための簡単なルールを適用したいと思います。

  1. アクセントのあるすべての文字(à、é、èなど)を、アクセントのない同等の文字(つまり、この例ではa、e、e)に置き換えます。
  2. すべての特殊文字をアンダースコアに置き換えます
  3. 全体を小文字にする

私のコードは次のようになります

protected String serverFilename(String localFilename) {
    if (localFilename == null || localFilename.length() == 0) {
        throw new IllegalArgumentException("Invalid filename for upload (localFilename=" + localFilename + ")");
    }

    String result = Normalizer.normalize(localFilename, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "").replaceAll("[^a-zA-Z0-9.]", "_").toLowerCase();
    LOG.debug("filename " + localFilename + " returns: " + result);
    return result;
}

この単体テストは問題なく実行されます。

assertEquals("capture_d_ecran_2012_08_02_a_12.45.29.png", uploader.serverFilename("Capture d’écran 2012-08-02 à 12.45.29.png"));

しかし、実際のアクション、つまりMacサーバー上でローカルに実行されているTomcat 6では、同様のファイル名のファイルを取得すると、「capture_d_ao__cran_2012_07_10____10.22.01.png」というファイル名が取得されます。

filename Capture d’écran 2012-07-10 à 10.22.01.png returns: capture_d_ao__cran_2012_07_10____10.22.01.png

どこかにある種の誤エンコードがあると思いますが、どこにあるのかわかりません。これを修正するためのヒントはありますか?

更新:Javaソースファイルとファイルのアップロードを担当するHTMLの両方がUTF-8でエンコードされています。

4

1 に答える 1

0

Java ソース ファイルは、HTTP 要求エンコーディングとは異なるエンコーディング (Mac のデフォルトは MacRoman である傾向がありますが、どこでも常に UTF-8 を使用する必要があります) で保存されていると思います。

OPのリクエストでコピペしました。

于 2012-08-02T13:42:04.733 に答える