1
public void ZipExtract(Stream inputStream, string outputDirectory)
    {

        using (ZipFile zip = ZipFile.Read(inputStream))
        {
            Directory.CreateDirectory(outputDirectory);
            zip.ExtractSelectedEntries("name=*.jpg,*.jpeg,*.png,*.gif,*.bmp", " ", outputDirectory,
                                       ExtractExistingFileAction.OverwriteSilently);
        }
    }
 [HttpPost]
    public ContentResult Uploadify(HttpPostedFileBase filedata)
    {
        var path = Server.MapPath(@"~/Files");
        var filePath = Path.Combine(path, filedata.FileName);
       if (filedata.FileName.EndsWith(".zip"))
        {

            ZipExtract(Request.InputStream,path);

        }
        filedata.SaveAs(filePath); 

            _db.Photos.Add(new Photo
                               {
                                   Filename = filedata.FileName
                               });

        _db.SaveChanges();
        return new ContentResult{Content = "1"};

    }

ストリームからzipアーカイブを読み込んでファイルを抽出しようとしています。「using (ZipFile zip = ZipFile.Read(inputStream))」の行で次の例外を取得しました: ZipEntry::ReadDirEntry(): 0x0000EE19 の位置にある署名が正しくありません (0xC618F879) この例外を処理する方法はありますか?

4

2 に答える 2

2

読み取ろうとしているストリームが有効な zip バイトストリームではないため、エラーが発生しています。ほとんどの場合、Request.InputStream は zip ファイルを表しません。これは、次のような HTTP メッセージを表します。

POST /path/for/your/app.aspx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; ...)
Content-Type: application/x-www-form-urlencoded
Content-Length: 11132

 ...more stuff here...

あなたがしていることは、そのメッセージを zip ファイルであるかのように読み取ろうとしていると思います。それはうまくいきません。ファイルの内容は、実際には "... more stuff here..." の部分に埋め込まれています。

これを解決するために、より小さなステップで作業することをお勧めします。

まず、ファイルのアップロードを機能させ、アップロードされたファイルのコンテンツをサーバー上のファイルシステム ファイルに保存します。次に、サーバーで、ファイルを zip ファイルとして開いてみます。それが機能する場合、ファイル保存部分を ZipFile.Read() に置き換えることができるはずです。保存したファイルを開くことができない場合は、保存したファイルが zip ファイルではないことを意味します。不完全であるか、HTTP ヘッダーなどの不要なデータが含まれている可能性が高いです。

zip ファイルなどのバイナリ ファイルを正常にアップロードできない場合は、まずテキスト ファイルのアップロードに取り組んでください。アップロードされたコンテンツをテキスト エディターで開き、クライアントからアップロードされたファイルのコンテンツが正確に含まれていることを確認するだけで、サーバー上のテキスト ファイルのアップロードをより簡単に確認できます。これが機能したら、バイナリ ファイルに移動します。次に、DotNetZip を使用してストリームを読み取る、完全なストリーミング アプローチに移行できます。この時点まで来たら、zip ファイルとして読み取る前にファイルをファイル システムに保存する必要はありませんが、他の理由でとにかく保存したい場合があります。

これを支援するために、デバッグ HTTP プロキシである Fiddler2 を使用することをお勧めします。ブラウザ マシンにインストールして電源を入れると、ブラウザからサーバー上の ASPNET アプリケーションに送信されるメッセージを確認するのに役立ちます。ファイルのアップロードには、単なるファイル データ以外のものが含まれていることがわかります。

于 2011-02-23T01:06:38.747 に答える
-2

より安定した解決策は、ICSharpCode ZipLibを使用することです:http://www.sharpdevelop.net/OpenSource/SharpZipLib/Default.aspx

于 2011-02-19T18:38:06.220 に答える