- - PR -
Zipファイル作成ができない
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-08-12 10:47
いつもお世話になっております。
現在、WEBアプリケーションの開発を行っているのですが Zip形式でのファイルのダウンロードが出来ずに困っております。 処理としましては、あらかじめフォルダを作成して、DBより必要な情報を取得、 Excelファイルを作成しフォルダに格納(場合によってはpdfファイルも作成されます)。 その後、そのフォルダ内のファイルをZip形式で圧縮して、 一括ダウンロードを行おうとしています。 しかし、Excelファイル等の作成までは上手くいくのですが、 Zipファイルを作成しダウンロードして解凍してみると ファイルが壊れてしまっていました。 (ファイル名が途中で切れていて、拡張子すら付いていない状態です) いろいろ試してみたのですが、自分では解決することが出来ませんでした。 そこで、何かヒントやご指導をお願いしい次第です。 ソースは以下の通りです。 ↓ソース↓ /// <summary> /// Zip圧縮メソッド /// </summary> /// <param name="fileDir">圧縮対象ファイルパス</param> /// <param name="zipfileName">Zipファイル名(hogehoge.zip)</param> /// <returns>Zipメモリストリーム</returns> public static MemoryStream MakeZipFile( string fileDir, string zipfileName) { //作成するZIPファイルパス string zipPath = fileDir + zipfileName; string[] fileLists = System.IO.Directory.GetFiles(fileDir); //ZipOutputStreamの作成 java.io.FileOutputStream fos = new java.io.FileOutputStream(zipPath); java.util.zip.ZipOutputStream zos = new java.util.zip.ZipOutputStream(fos); //Zipにファイルを追加する foreach (string file in fileLists) { //ZIPに追加するときのファイル名を決定する string fName = System.IO.Path.GetFileName(file); java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(fName); ze.setMethod(java.util.zip.ZipEntry.DEFLATED); ze.setTime(System.IO.File.GetLastWriteTime(file).Date.ToFileTimeUtc()); zos.putNextEntry(ze); //FileInputStreamの作成 java.io.FileInputStream fis = new java.io.FileInputStream(file); //書込み sbyte[] buffer = new sbyte[8192]; int len; while((len = fis.read(buffer, 0, buffer.Length)) > 0) { zos.write(buffer, 0, len); } //閉じる fis.close(); zos.closeEntry(); } zos.close(); fos.close(); StreamReader sr = new StreamReader(zipPath,System.Text.Encoding.Default); BinaryReader br = new BinaryReader(sr.BaseStream); byte[] bZip = br.ReadBytes(int.Parse(sr.BaseStream.Length.ToString())); MemoryStream ms = new MemoryStream(bZip); br.Close(); sr.Close(); return ms; } | ||||
|
投稿日時: 2008-08-12 12:57
"ZipOutputStream" でこの会議室を検索し、動いているコードとの違いを見られてはいかがでしょうか。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2008-08-12 14:22
じゃんぬさん、返信ありがとうございます。
現在、じゃんぬさんの仰るとおり検索を行い確認しています。 そこで以下の質問に目を付けてみました。 「【ASP.NET】Webサーバ側で複数Excelを圧縮したい」 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=29412&forum=7&start=0 そして、さっき気づいたのですが・・・・ Zipにする前処理で、バイト配列からBinaryWriterを使ってExcelファイルを 作成しているのですが、そのバイト配列を引数で渡して使ったほうが効果的でしょうか? 見当違いのことを言っていたらすみません。。 | ||||
|
投稿日時: 2008-08-12 14:48
それは動作と関係ないですよね。 動作で困っているのですから、動作に関わるところを比較しないといけないですよね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2008-08-12 16:12
そうでした・・・すみません。気が焦ってしまって。。 先ほど挙げたところのソースと比較しながら修正してみました。 が、まだ上手くいきません。Lhaplusで解凍すると 「アーカイブのヘッダに異常がありました」と表示され解凍されませんでした。 方向は合っていますでしょうか? ---------------------------------------------- public static MemoryStream ConvertZipFile( string fileDir, string zipfileName) { //圧縮ファイルフルパス string zipPath = string.Empty; string[] filePaths = System.IO.Directory.GetFiles(fileDir); //作成するZIPファイルの設定 zipPath = fileDir + zipfileName; //ZipOutputStreamの作成 java.io.FileOutputStream fos = new java.io.FileOutputStream(zipPath); java.util.zip.ZipOutputStream zos = new java.util.zip.ZipOutputStream(fos); //Zipにファイルを追加する foreach (string file in filePaths) { //ZIPに追加するときのファイル名を決定する string f = System.IO.Path.GetFileName(file); //FileInputStreamの作成 java.io.FileInputStream fis = new java.io.FileInputStream(file); java.io.BufferedInputStream bis = new java.io.BufferedInputStream(fis); // ファイルサイズ取得 int iFileSize = Convert.ToInt32(new System.IO.FileInfo(file).Length); //書込み sbyte[] buffer = new sbyte[iFileSize]; java.util.zip.CRC32 oCrc32 = new java.util.zip.CRC32(); if(bis.read(buffer, 0, iFileSize) > -1) { oCrc32.update(buffer, 0, iFileSize); zos.write(buffer, 0, iFileSize); } java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(f); ze.setMethod(java.util.zip.ZipEntry.DEFLATED); ze.setSize(iFileSize); ze.setCrc(oCrc32.getValue()); zos.putNextEntry(ze); //閉じる bis.close(); fis.close(); zos.closeEntry(); } zos.close(); fos.close(); StreamReader sr = new StreamReader(zipPath,System.Text.Encoding.Default); BinaryReader br = new BinaryReader(sr.BaseStream); byte[] bZip = br.ReadBytes(int.Parse(sr.BaseStream.Length.ToString())); MemoryStream ms = new MemoryStream(bZip); br.Close(); sr.Close(); return ms; } ---------------------------------------------- | ||||
|
投稿日時: 2008-08-12 17:13
現象をもっと具体的に書いたほうが良いかと思います。
・ZIPファイルは展開できるの? できないの? どのツールで? ・文字化けの場合、「こうなるはずのファイル名がこのように化けている」 | ||||
|
投稿日時: 2008-08-12 17:21
スフレさん、お返事ありがとうございます。 前回の書き込みで書いたつもりでしたが、少しまとまっていませんでした。。 申し訳ありません。 現象は、 ・Zipファイルは作成される。 ・解凍時にエラーが出て展開できません。 ・解凍ツールは「Lhaplus」。 といった感じです。 [ メッセージ編集済み 編集者: 烈 編集日時 2008-08-12 17:22 ] | ||||
|
投稿日時: 2008-08-12 17:40
ファイル名が切れるのではなかったのでしょうか?
サーバ側に一時的に作ったzipファイルとクライアントでダウンロードしたzipファイルは一致してますか? |