- PR -

圧縮ファイルのダウンロードについて

投稿者投稿内容
ボルビ
ベテラン
会議室デビュー日: 2007/05/23
投稿数: 52
投稿日時: 2007-11-01 10:55
いつもお世話になっています。

環境:Visual Studio 2005、 ASP.NET C#、 .NET Framework 2.0

Webフォームのボタンを押された時に、データベースから取得したテーブルの内容を
動的に圧縮し、ブラウザーの「このファイルを開くか、または保存しますか?」
ダイアログで保存する処理を考えています。

http://www.atmarkit.co.jp/fdotnet/dotnettips/361aspzipfile/aspzipfile.html
上記のサイトを参考にしてみたんですが、Zipファイルをサーバーに保存する処理に
なっていたので、保存しないでブラウザーの「このファイルを開くか、または保存しますか?」
ダイアログで保存するやりかた探したのですが見当たらないのでご教授御願い致します。

--------------------------------------------------------------------------------------------
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=test.zip");

参考にしたサイトにはこの記述がなかったので追加してダイアログは表示され、
  ファイルは保存できるのですが中身がない圧縮ファイルができます。

多分、下記の処理★の箇所が関係すると思うのですが、JavaではZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
  としてダウンロードができたので、J#でも同じ様な事は可能なのでしょうか?
★ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(Server.MapPath("data/test.zip")));

--------------------------------------------------------------------------------------------

// 指定されたファイルへの圧縮出力ストリームを生成
ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(Server.MapPath("data/test.zip")));
ByteArrayOutputStream bArray = new ByteArrayOutputStream();
OutputStreamWriter oStream = new OutputStreamWriter(bArray, "SJIS");

//ヘッダ
oStream.write("test1");
oStream.write(",");
oStream.write("test2");
oStream.write(",");
oStream.write("test3");
oStream.write("\\r\\n");
//データ
oStream.write("11111" + ",");
oStream.write("22222" + ",");
oStream.write("33333");
oStream.close();

ZipEntry zEntry = new ZipEntry("test1.csv");
zEntry.setMethod(ZipOutputStream.DEFLATED);

zipStream.putNextEntry(zEntry);
zipStream.write(bArray.toByteArray(), 0, bArray.toByteArray().Length);
zipStream.closeEntry();

zipStream.flush();
zipStream.close();
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-11-01 11:51
引用:

Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=test.zip");

参考にしたサイトにはこの記述がなかったので追加してダイアログは表示され、
  ファイルは保存できるのですが中身がない圧縮ファイルができます。


Response.BinaryWrite()で中身出力していますでしょうか?

HttpResponse.BinaryWrite メソッド
http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.binarywrite(VS.80).aspx
ボルビ
ベテラン
会議室デビュー日: 2007/05/23
投稿数: 52
投稿日時: 2007-11-01 12:55
返信ありがとうございます。

引用:

IIJIMASさんの書き込み (2007-11-01 11:51) より:
Response.BinaryWrite()で中身出力していますでしょうか?

HttpResponse.BinaryWrite メソッド
http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.binarywrite(VS.80).aspx



記述したソースの通りなんで、Response.BinaryWrite()は使用していません。

記述した処理を実行するとdataフォルダには中身がある圧縮ファイルはできています。
ファイルを指定のフォルダに自動的に落とさず、ブラウザーのダイアログで
保存先を指定して保存する感じにしたいんです。Javaではできたんですけど
J#でのサンプルがないので皆さんどうやっているのでしょうか??


かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-11-01 13:09
どのストリームからどのストリームにデータを転送しようとしていますか?
ファイル→Zip→Response へと転送しないといけませんよね。
_________________
かるあ のメモスニペット
ボルビ
ベテラン
会議室デビュー日: 2007/05/23
投稿数: 52
投稿日時: 2007-11-01 14:12
返信有難うございます。
引用:

かるあさんの書き込み (2007-11-01 13:09) より:
どのストリームからどのストリームにデータを転送しようとしていますか?
ファイル→Zip→Response へと転送しないといけませんよね。


Zip→Responseに転送するしかたが分からないのです。

IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-11-01 14:21
引用:

ボルビさんの書き込み (2007-11-01 14:12) より:

Zip→Responseに転送するしかたが分からないのです。



先ほども書きましたようにbyte[]にしてBinaryWriteで出力するか、

HttpResponse.OutputStream プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.outputstream(VS.80).aspx
に出力してみてはどうでしょうか。
ボルビ
ベテラン
会議室デビュー日: 2007/05/23
投稿数: 52
投稿日時: 2007-11-01 15:28
引用:

IIJIMASさんの書き込み (2007-11-01 14:21) より:

先ほども書きましたようにbyte[]にしてBinaryWriteで出力するか、

HttpResponse.OutputStream プロパティ
http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.outputstream(VS.80).aspx
に出力してみてはどうでしょうか。



MSDNを見てもBinaryWrite or OutputStreamを記述した処理に
どうやって入れ込むかが分かりません。
処理自体を変えないと難しいのでしょうか?

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-11-01 16:55
まず最初の例では
Inストリーム→Zipストリーム→Outストリーム
になっているわけですよね。

これがそれぞれどの部分かわかりますか?
それがわかれば、あとはストリームを切り替えるだけだと思うのですが。

最初にボルビさん自身がおっしゃっていますが、注目点はいいとおもいますよ。
#っていうか、こたえでてるんじゃ。。。
_________________
かるあ のメモスニペット

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