読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

長いファイル名を持つファイルダウンロードで名前が途中で切れる件


先日、半角スペースの文字化け問題を取り上げましたが、
今度はIEで、『長いファイル名を持つファイルをダウンロードすると、ファイル名が最後の15文字程度しか残らない』という問題が発生。
(ただし環境による模様。僕のマシンでは発生しました)


調べてみると、どうやらIEはContent-Dispositionの値としてせいぜい200バイト程度しか許容していないらしい。
コチラがかなり参考になりました。


で、この問題に対するMicrosoftの回答は、


「長いファイル名を使わなきゃいいだけじゃね?」


... orz


自分で使うシステムならともかく、お客様に納入するシステムでは、そういう仕様を理解してもらうことは難しいんですよねぇ。

解決策

で、もう少し調べてみると、どうやらIEはContent-Dispositionの値として
Shift_JISエンコーディングされたものも許容するとのこと。
(というか、むしろコチラが正式な仕様らしい)


ファイル名をShift_JISエンコードすれば、URLエンコーディングするより、かなりコンパクトになります。


Javaで書くとこんな感じ。

HttpServletResponse res = ...;

String longFileName = ...
String sjisEncodedLongFileName = new String(longFileName.getBytes("Windows-31J"), "ISO-8859-1");

res.addHeader("Content-Disposition", "attachment; filename=" + sjisEncodedLongFileName);


これで、おおよそ50〜60文字程度までのファイル名でもOKです。


それ以上だと…「そんなに長いファイル名を使わなきゃいいだけじゃね?」