3

私はWindowsAzureを使用してドキュメント管理システムを作成してきましたが、これまでのところ順調に進んでいます。asp.netフロントエンドを介してファイルをBLOBストレージにアップロードおよびダウンロードすることができました。

私が今やろうとしているのは、ユーザーが.zipファイルをアップロードし、その.zipからファイルを取り出して、個別のファイルとして保存できるようにすることです。問題は、「ZipExceptionが処理されなかった」「ヘッダーのEOF」が発生しているのですが、その理由がわかりません。

私は他の多くのタスクに使用したICSharpCode.SharpZipLibライブラリを使用しており、それはうまく機能しました。

基本的なコードは次のとおりです。

CloudBlob ZipFile = container.GetBlobReference(blobURI);
MemoryStream MemStream = new MemoryStream();
ZipFile.DownloadToStream(MemStream);
....
while ((theEntry = zipInput.GetNextEntry()) != null)

そして、それは私がエラーを受け取る間で始まる行にあります。十分な時間が経過したことを確認するために、10秒のスリープ時間を追加しました。

MemStreamをデバッグすると長さがありますが、zipInputは長さがある場合がありますが、常にそうとは限りません。常に失敗します。

4

2 に答える 2

2

ランダムな推測ですが、読む前にストリームを0に戻す必要がありますか?すでにそれを行っているかどうか(または必要かどうか)はわかりません。

于 2010-03-30T21:01:22.460 に答える
0

@Smarxヒントも私のためにトリックをしました。zip内の空のファイルを回避するための鍵は、位置をゼロに設定することです。わかりやすくするために、AzureBLOBを含むzipストリームをブラウザーに送信するサンプルコードを次に示します。

        var fs1 = new MemoryStream();
        Container.GetBlobReference(blobUri).DownloadToStream(fs1);
        fs1.Position = 0;

        var outputMemStream = new MemoryStream();
        var zipStream = new ZipOutputStream(outputMemStream);

        var entry1 = new ZipEntry(fileName);
        zipStream.PutNextEntry(entry1);
        StreamUtils.Copy(fs1, zipStream, new byte[4096]);
        zipStream.CloseEntry();

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + zipFileName);
        Response.OutputStream.Write(outputMemStream.ToArray(), 0, outputMemStream.ToArray().Length);
        Response.End();
于 2012-04-17T23:40:10.710 に答える