@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ダウンロード時にファイル名が文字化けする件

1
投稿者投稿内容
ほや
会議室デビュー日: 2002/05/27
投稿数: 18
お住まい・勤務地: 関西
投稿日時: 2002-05-27 15:01
こんにちは。

VS.NETおよびC#のWebアプリケーションで、ダウンロードダイアログを使った
ファイルダウンロードをしようとしています。
しかし、漢字かな混じりのファイル名をもつファイルをダウンロードしようとすると、
ダウンロードダイアログの中のファイル名が文字化けしたり、漢字かな部分だけ欠落
したりしてしまいます。
web.Configのglobalizationも”Shift_JIS”にしたのですが、結果は変わりません。
C#のstringはunicodeだそうなので、自前でstringをエンコードする関数を作って
ファイル名を変換してみたりもしたのですが、やはり結果は変わりませんでした。

どなたか解決方法を知ってみえませんでしょうか?


以下、ダウンロードする関数です。

private void DownloadFile(string path)
{
string name = Path.GetFileName( path );
Response.ContentType = type;
Response.ContentEncoding = Encoding.GetEncoding("Shift_JIS");
Response.Charset = "shift_jis";
Response.AppendHeader( "content-disposition","attachment; filename=" +
Encode(name));
Response.WriteFile( path );
Response.End();
}

private string Encode(string str)
{
Byte[] bytes = Encoding.Unicode.GetBytes(str);
Encoding enc = Encoding.GetEncoding("Shift_JIS");
Byte[] s_bytes = Encoding.Convert(Encoding.Unicode, enc, bytes);
string ret = enc.GetString(s_bytes);
return ret;
}
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-05-27 18:57
私はまったく素人で、な〜んにもしらないのですが、
バイナリ文字列は送受信できるのでしょうか?
URLEncode / URLDecode は必要ありませんか?

必要だとすれば、

送信側:ファイル名(SJIS) -[URLEncode]-> 送信
受信側:受信 -[URLDecode]-[SJIS to Unicode]-> ファイル名

か、

送信側:ファイル名(SJIS)-[SJIS to Unicode]-[URLEncode]-> 送信
受信側:受信 -[URLDecode]->ファイル名

すべきかと。
ほや
会議室デビュー日: 2002/05/27
投稿数: 18
お住まい・勤務地: 関西
投稿日時: 2002-05-28 14:49
URLEncode/URLDecodeについてよく知らなかったので、ちょっと調べたのですが、
この関数は、URLに空白とかの文字列が埋められないから、非英数文字を「%数値」であらわさ
れる文字列に変換するメソッドらしいです。
なので、下の例みたいに、Htmlのタグとその中身をじかにResponseに書く場合は、有意義か
と思います。
ダウンロードで使えないかな?といろいろ試したのですが、うまくいきませんでした・・・。
FileInfo[] theFiles = thisOne.GetFiles();
Response.Write("<ul>");
for (int i=0; i < theFiles.Length; i++)
{
Response.Write("<li><a href=\"showfile.aspx?file=");
Response.Write(Server.UrlEncode(theFiles[i].FullName));
Response.Write("\">" + theFiles[i].Name);
Response.Write("</a><br>");
}
Response.Write("</ul>");
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-05-28 15:58
んん?しょむさんがおっしゃっているとおり、UrlEncodeで当方ではうまくいっています。ほやさんのコードの

コード:
Response.AppendHeader(
    "content-disposition",
    "attachment; filename=" + Encode(name));


を次のように変更しただけでちゃんと動作しました(IE6)。

コード:
Response.AppendHeader(
    "content-disposition",
    "attachment; filename=" + HttpUtility.UrlEncode(name));


ほや
会議室デビュー日: 2002/05/27
投稿数: 18
お住まい・勤務地: 関西
投稿日時: 2002-05-28 16:10
NothingBut.NETFXさんのコードでやったら、うまくいきました!!
ありがとうございます。
(私はなにをやっていたんだか・・・。)

ただ、ファイル名中にスペースがあると、スペース部分が"+"に変換されてダウンロードされました。
しょうがないですかねぇ。
(今まで散々文字化けしてたので、「+になるぐらい良しとするか!」という気分ですが。)

ためしに、ファイル名を"や'でくくったところ、
"でくくる→ダウンロードダイアログが出てこない。
'でくくる→ファイル名が、'ファイル名'になる。
という結果でした。


[ メッセージ編集済み 編集者: ほや 編集日時 2002-05-28 17:39 ]
masas
常連さん
会議室デビュー日: 2002/05/23
投稿数: 25
投稿日時: 2002-06-05 16:28
本題からちょっと外れますが、ダウンロードする方法はどうやって実現しているのでしょうか?。
プログラムを見る範囲ではイベントによってダウンロードさせているように思うのですが。。。。
ほや
会議室デビュー日: 2002/05/27
投稿数: 18
お住まい・勤務地: 関西
投稿日時: 2002-06-06 09:20
はい、そうです。
ただ単にダウンロードしてもらうだけなら、そのファイルにハイパー
リンクを張ればよかったのですが、プログラム側で、誰がダウンロード
したのかを知る必要があったのです。
なので、ダウンロード用のボタンを画面に配置して、それをクリックする
ことで、ユーザ(LogOnしている)にはダイアログを出してダウンロードしても
らい、プログラム側では、ダウンロードしたと判断するようにしました。

ただ、この方法にも欠点があり、ユーザがダウンロードダイアログでキャンセル
ボタンをクリックし、実際はダウンロードを行わなかったとしても、プログラム
側ではその事実がわからないのです・・・。
1

スキルアップ/キャリアアップ(JOB@IT)