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

CSVデータをDownLoad時に開くと0バイトになる?

1
投稿者投稿内容
クロ★
会議室デビュー日: 2008/06/24
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2008-06-26 18:57
ASP.NETでWEBサーバからCSVファイルをDownloadするプログラムを作っております。
ここで、
"ファイルのダウンロード"ダイアログが開いた後、
"開く"ボタンを押下すると0バイトのテキストが表示されます。
"保存"ボタンでローカルに保存した後、ダウンロードしたファイルを
開くと正しくデータが表示されるのですが、何かロジックが足りないのでしょうか?
原因をご存知の方、ご教授御願いします。

環境:WindowsXP ServicePack
Visual Studio2005

尚、ダウンロード部分のロジックは以下の通りです。

' ダウンロード
Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.ContentType = "application/octet-stream;charset=Shift_JIS"
Response.AddHeader("Content-Disposition", "attachment; filename=" & attchFileNm)
Response.HeaderEncoding = sjisEnc
Try
Response.BinaryWrite(sjisBytes)
ApplicationInstance.CompleteRequest()
Response.Flush()
Response.End()
Catch ex As Exception
Response.Clear()
If Not TypeOf ex Is System.Threading.ThreadAbortException Then
Throw ex
End If
End Try
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-06-27 05:54
コード:
Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS") 
Response.Cache.SetCacheability(HttpCacheability.NoCache) 
Response.ContentType = "application/octet-stream;charset=Shift_JIS" 
Response.AddHeader("Content-Disposition", "attachment; filename=test.csv") 
Response.HeaderEncoding = sjisEnc 
Try 
Response.BinaryWrite(File.ReadAllBytes("ファイルパス")) 
ApplicationInstance.CompleteRequest() 
Response.Flush() 
Response.End() 
Catch ex As Exception 
Response.Clear() 
If Not TypeOf ex Is System.Threading.ThreadAbortException Then 
Throw ex 
End If 
End Try

ボタンクリック時に上記コードで以下のcsvをダウンロードさせましたが正常に開けました。
(提示のソースと違うのは太字部分だけです)
コード:
test,test,tes,test,2
tests,tse,ts,ttse,d

クロ★
会議室デビュー日: 2008/06/24
投稿数: 5
お住まい・勤務地: 東京都
投稿日時: 2008-06-27 16:13
すみません、ソースの提示が一部抜けていました。
正確には以下のようになります。
データをバイト配列に展開しています。
補足として、クライアントへDownload以前はファイル等に保存されておらず
サーバ側で加工したデータ(sjis文字列)をバイト配列に展開して渡しています。

コード:---------------------------------------------------------------
Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
Dim utf8Enc As Encoding = Encoding.UTF8
Dim utf8Bytes As Byte() = utf8Enc.GetBytes("abc")
Dim sjisBytes As Byte() = Encoding.Convert(utf8Enc, sjisEnc, utf8Bytes)

' ダウンロード
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.ContentType = "application/octet-stream;charset=Shift_JIS"
Response.AddHeader("Content-Disposition", "attachment; filename=" & attchFileNm)
Response.HeaderEncoding = sjisEnc
Try
Response.BinaryWrite(sjisBytes)
ApplicationInstance.CompleteRequest()
Response.Flush()
Response.End()
Catch ex As Exception
Response.Clear()
If Not TypeOf ex Is System.Threading.ThreadAbortException Then
Throw ex
End If
End Try
-----------------------------------------------------------------------
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-06-27 21:24
コード:
Response.AddHeader("Content-Disposition", "attachment; filename=test")

この部分だけ変えてやってみましたが再現しません。ブラウザにabcとでます。ちなみに環境は
WindowsXP ServicePack 2
Visual Studio2005 (Visual Web Developer2005でも同じ)
Internet Explorer 7

引用:
Dim utf8Enc As Encoding = Encoding.UTF8
Dim utf8Bytes As Byte() = utf8Enc.GetBytes("abc")
Dim sjisBytes As Byte() = Encoding.Convert(utf8Enc, sjisEnc, utf8Bytes)

ここは何の意味があるのですか。
Dim sjisBytes As Byte() = sjisEnc.GetBytes("abc")
だけでいい気がしますが。
1

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