• 締切済み

長いファイル名が化けてしまう

ファイルをダウンロードする際に、ファイルを読み込み、 ServletOutputStreamに書き込んでいます。 その際に、ダウンロードファイル名に2バイト文字が 大量に含まれていると、クライアントから要求したサーブレット名に 置き換わってしまいます。 また、記号を含む長い日本語ファイル名をダウンロードした場合は 一部の文字だけが別の文字に置き換わっている現象も 発生します。 ASCII文字のみで構成されたファイル名、 もしくは短い日本語ファイル名であれば問題はありません。 ヘッダへの設定は以下の様に行っています。 response.setContentType( "application/octet-stream" ); response.setHeader( "Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode( downloadFileName, "UTF-8" ) ); Content-Dispositionに設定するファイル名を UTF-8でURLEncoder.encodeしているのですが、 ログ出力すると、2バイト文字のみのファイル名であれば 25~26文字程度を超えた時点で、MIME変換後の文字長が 255文字を超過してしまい、リクエスト要求したサーブレット名に 置き換わってしまうように見受けられます。 いま作っているシステムはInternetExploler5.5SP2以降のIEで動作することが仕様となっています。

  • Java
  • 回答数1
  • ありがとう数1

みんなの回答

  • jun2004
  • ベストアンサー率42% (24/57)
回答No.1

環境はApache+Tomcatでしょうか? Tomcatのみの場合、ファイル名はSJISのバイナリーを送れば大丈夫だったと思います。Apacheを通した場合、Apacheとのコネクターで何やらコードの変換が行われるみたいでファイル名が化けるのでURLエンコードが必要みたいです。コネクターのソースを変更してリコンパイルすればいいのかもしれませんがやった事が無いので確かな事が言えません。 文字化けは、ファイルシステムのファイル名(EUC or SJIS)をStringにする時にUnicodeに変換できないで化けていると思われますUnicodeにする限り避けられないのではないでしょうか。 日本語ファイル名の取り扱い苦労しますよね。決定的な回答ができなくてすいません。お悩み共有と言うか参考程度に受け取って頂ければ思います。

関連するQ&A

  • CSVファイルをダウンロード時のファイル名文字化けについて

    weblogic+java1.4.2+struts+IE6.0 でWebシステム開発を行っています。 CSVファイルをダウンロードする機能で、 CSVファイル名が全角で60バイト以上にしたとき、ダウンロード時のファイル名の先頭が 「08」、「C9」などに文字化けしてしまいます。 60バイト以内にするとファイル名は正常に表示されます。 ぜひこの現象に対する対応策、URLなどご存知の方はご教授ください。 また回避不可能な場合、理由または技術情報が明記されたURL、技術文献の情報などありましたら そちらもお教えください。 outputstream出力時のソースは以下の通りです。 ↓ try{ response.setContentType(contentType); response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));     response.getOutputStream().write(fileContents); }catch (Exception e){ }finally{ response.getOutputStream().close(); } return null; 以上宜しくお願いいたします。

    • ベストアンサー
    • Java
  • ダウンロードファイル名の文字化けについて

    IE画面上にファイル名がリンク表示されており、 ファイル名のクリックで起動されるDownloadServletを作成しました。 日本語を含むファイル名のダウンロードを行うと、 「ファイルのダウンロード」ダイアログではファイル名がきちんと表示されるのですが、 「ファイルの保存」ダイアログでのファイル名が文字化けしてしまいます。 ダウンロード実施後のファイル名も文字化けのままです。 servletでのレスポンスヘッダの設定は以下のように行っています。 res.setContentType("application/octet-stream; charset=Shift_JIS"); res.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8")); 現象が起きている環境はWindows2000Professional, IE6.0で、 WindowsXPなら問題ありませんでした。 例えば「通達.pdf」というファイル名だと、 ”通達”という文字列が”騾夐#”と化けます。 多少調べてみたところURLEncoderではUTF-8コードを%+16進数文字に変換するので、 結果が以下のようになります。 %E9%80%9A%E9%81%94.PDF これをデコード時?にまずUTF-8として読んで、 それからSJIS変換すれば?ちゃんと読めるのかと思うのですが、 どうも「%E9%80%9A%E9%81%94」をそのままSJISコードとしてデコードして 「騾(E980)夐(9AE9)#(8194)」となっている感じです。 ダウンロード処理で出すダイアログはIEに依存しているので 特にデコードなどを自分で行っているわけではないですし、 WindowsXPではちゃんと表示されるなど、 デコード方式がOSに依存?しているような気もするので対処の方法がわかりません。 ダウンロードservletのプログラムの中でどうにか対処できるものなのでしょうか? わかりにくい質問ですみませんが、ぜひご回答よろしくお願いいたします。

    • ベストアンサー
    • Java
  • BLOBをダウンロードして別ウインドウで表示したい。

    申し訳ありありませんが、どなたか答えていただけると幸いです。 byte[] data = bl.getBytes(1, (int)bl.length()); int imgSize = (int)bl.length(); String file = URLEncoder.encode(rs_index.getString(ファイル名)); response.setContentType("application/octet-stream-dummy"); response.setHeader("Content-Disposition","inline; filename=\"" + file + "\""); response.setHeader("Pragma", ""); response.setHeader("Cache-Control","max-age=0"); response.setContentLength(data.length); response.getOutputStream().write(data); response.flushBuffer(); こんな感じなのですが、IEでダウンロードして表示をしますと、 IEでEXCELなどが表示されてしまいます。 エクスプローラの設定をいじらずに、EXCELはEXCELで表示するように できないのでしょうか? HTMLのように、target="_blank"みたいにしたいのですが・・・ Java初心者なので、よくわかっていないかもしれませんが、 宜しくお願い致します。

  • ダウンロードが正常終了するけど件数が少ない。。。

    こんにちわ。 サーブレットであるファイルをダウンロードしようとしたら 実際のファイルの半分程度しかダウンロードできませんでした。 ちなみにアクセスログ上はダウンロード失敗等のエラーもでていません でした。。。 回線が途切れたわけでもないのにこのような現象が起こりえるのでしょうか? response.setHeader("Pragma", "private"); response.setHeader("Cache-control", "private"); response.setHeader("Content-Disposition", "inline; filename=\ファイルパス\"); response.setContentType("text/*; encoding=Shift_JIS"); の様な感じです。。。。 まず、HTTP上で消える、切れる等が起こりえるのでしょうか? どなたか経験のある方がいらっしゃればよろしくお願いします。

    • ベストアンサー
    • Java
  • ダウンロードについて

    jspに<a href="ファイル名">ダウンロード</a> でそのファイルをダウンロードできると思ってました。 (ダウンロードするファイルはjspと同じフォルダにあります。) が、「404ページが見つかりません」になります。 formにactionとmethod=postを指定してます。 jspは以下のような感じです。 <form action="アクション名" method="post"> <a href="./download.zip">ダウソ</a> </form> また、エクセルをダウンロードするのも同様にやると、 404になり、エクセルが起動し、ブラウザに内容が表示されたりすることもありません。 htmlに同じように書くとダウンロードの画面がでたり、エクセルが起動したりしてくれます。 過去の質問からサーブレットのresponseから、アウトプットストリームを取得し、エクセルの内容をそれに吐き出す?感じにするとダウンロード画面がでました。 <a href>だとダウンロードできないのでしょうか? どうすればできるのでしょうか? それと、アウトプットにwriteするやり方で、 res.setHeader("Content-Disposition", "attachment; filename=ファイル名"); で、ファイル名が日本語の場合、ダウンロードのファイル名が正しくないのですが、URLEncoderにはjavaのバージョンのせいか、encodeメソッドの引数が1つしかなく、エンコードを指定できず、ファイル名が意図しないものになるのですが、うまい解決法はないでしょうか? バージョン上げるのは無理ですけど・・。 よろしくおねがいします。

  • 日本語名のファイルのダウンロード

    ファイルのダウンロードを行うservletを作成しています。 ところが漢字を含むファイル名のファイルをダウンロードしようとすると、ファイルのダウンロードダイアログでファイル名が正しく表示されません。どうやったら正しく表示できるようになるでしょうか?皆様のお知恵をお貸しください。 レスポンスヘッダには以下の設定をしています。 res.setContentType("application/octet-stream; charset=Shift_JIS"); res.setHeader("Content-Disposition", "attachment; filename=" + filename); filenameが"V003-0.pdf"の場合、ファイルのダウンロードダイアログで「ファイル名」は正しく表示され、「ファイルの種類」もAdobe Acrobat Documentとなりました。しかし"通達V003-0.pdf"というファイル名にしたら「ファイル名」は英数字に変わっており(さらに拡張子も表示されない)、「ファイルの種類」は表示されなくなってしまいました。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ファイルのダウンロード先を初期設定するには?

    サーブレットにファイルをダウンロードする機能を入れたいと思って います。 現在、HttpServletResponseオブジェクトを使用して下記のようにコー ディングしています。 ============================================= response.setHeader("Content-Disposition", "attachment;filename=sample.xls"); response.setContentType("application/vnd.ms-excel"); ============================================= これで問題なくダウンロードは出来るのですが、ダウンロード先の初期 表示をブラウザ(現在、IEを使用してます)に依存するのではなく、予 め指定したフォルダを初期表示して欲しいとの要望がありました。 ダウンロード先を初期設定するとはいえ、ユーザーが自由にファイル名 やダウンロード先を指定する機能は必要なので、FileOutputStreamを使 用してのファイルの保存は考えていません。 どのようにすれば、実現するのでしょうか? また、ファイルのダウンロード先を初期設定することは可能なのでしょ うか? それさえ判断が出来ずに困っています。 もし絶対に無理!ということであれば、それを教えて頂けるだけでも助 かります。

    • ベストアンサー
    • Java
  • ファイルダウンロード後のフォワードについて

    サーブレット内で、ファイルのダウンロードをした後に処理をJSPへフォワードしたいのですが、現在、ダウンロードしたあとフォワードしてもJSPが機能しなくて困りました。 コードとしては以下の通りです(一部抜粋ですみません) /* ファイルダウンロードの設定 */ response.setContentType("application/octet-stream; charset=Shift-JIS"); response.setHeader("Content-disposition","attachement; filename= "+sgy_y+sgy_m+"_"+simekbn+".csv"); PrintWriter pw = response.getWriter(); /* CSVファイル出力 */ pw.println("あああ,いいい,ううう,えええ,おおお"); pw.println("かかか,ききき,くくく,けけけ,こここ"); pw.println("さささ,ししし,すすす,せせせ,そそそ"); pw.close(); /* JSPへフォワード */ getServletConfig().getServletContext().getRequestDispatcher("/xxx.jsp").forward(request,response); 何か良いアドバイスがありましたら、宜しくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルのダウンロード時に、パラメータ(Getメソッドで渡される

    CSVファイルのダウンロード時に、パラメータ(Getメソッドで渡される CGI引数(QUERY_STRING環境変数の中身))を、 Javaサーブレット(doGetメソッド内)内で、以下のようにして   ↓ final ResultSetMetaData meta = rs.getMetaData(); response.setContentType("application/octet-stream;charset=utf-16le"); final StringBuffer sbUrl = new StringBuffer(); sbUrl.append("KYOIKU.csv"); sbUrl.append("?").append("20101029162359"); response.setHeader("Content-Disposition", "attachment; filename=" + sbUrl.toString()); out = response.getWriter(); として実行してみたところ、 半角の?(クエスチョンマーク)が、 半角の_(アンダーバー)に変換されて、 テキストファイルとして出力されています。 (KYOIKU.csv_20101029162359) イメージとしては、doGetメソッドからのCSVファイルダウンロード時に、 URLとして、 「http://hogehoge.co.jp/KYOIKU.csv?20101029162359」 として、セット後に実行したいと思っております。 そこでご質問内容なのですが、 ネットで調べていて、先程たまたま、 「URLの末尾にユニークな捨て文字を付加するという手法」として、 「ダウンロードするファイルを、キャッシュにあるファイルとは別物だとIE  に思わせれば、結果的に目的を果たせます。    ↓  (目的とは、CSVファイルのダウンロード時に直接[開く]を押下した場合に、   余計な→[1]文字列が自動的にExcelファイル名として追加されなくなること)」 という記事をたまたま見つけました。 それを試す為に、 「URLの?文字、およびそれ以降の文字列」を、 どのようにすれば、セットできるのか? その方法を教えてください。 お世話になります。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • ie8でのファイルダウンロード

    javaで作成したプログラムからファイルをダウンロードする際に、 稀にファイルと拡張子の間に半角英数字が8文字付加されて 保存先を指定するダイアログに表示される場合があります。 javaでは以下の様にファイル名を指定しています。(抜粋) strWorkFileName = "PO.DAT"; response.setHeader("Content-Disposition", "attachment;filename=" + strWorkFileName); 通常表示されるファイル名:PO.DAT まれに表示されるファイル名:POCAY7P4Y1.DAT CAY7P4Y1の箇所は現象が発生する度に異なります。 どなたか原因がわかるかたいらっしゃいませんか? 発生した環境 OS:Windows 7 ブラウザ:IE8

専門家に質問してみよう