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(): Bad signature (0xC618F879) at position 0x0000EE19 任何想法如何处理此异常?

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 文件读取之前,应该不需要将文件保存到文件系统,但出于其他原因,您可能仍想保存它。

为了提供帮助,您可能需要使用 Fiddler2,调试 HTTP 代理。将它安装在浏览器机器上,打开它,它将帮助您查看从浏览器发送到服务器上的 ASPNET 应用程序的消息。您会看到文件上传包含的不仅仅是裸文件数据。

于 2011-02-23T01:06:38.747 回答
-2

更稳定的解决方案可能是使用 ICSharpCode ZipLib:http ://www.sharpdevelop.net/OpenSource/SharpZipLib/Default.aspx

于 2011-02-19T18:38:06.220 回答