首页 文章

使用DotNetZip从流中提取zip

提问于
浏览
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():错误签名(0xC618F879)位于0x0000EE19任何想法如何处理此异常?

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..."部分中 .

    为了解决这个问题,我建议你采取较小的步骤 .

    首先,让文件上传工作,将上传文件的内容保存到服务器上的文件系统文件中 . 然后,在服务器上,尝试将文件作为zipfile打开 . 如果它工作,那么你应该能够用ZipFile.Read()替换文件保存部分 . 如果您无法打开保存的文件,则表示您保存的文件不是zip文件 . 要么它不完整,要么更有可能包括无关的数据,比如HTTP标头 .

    如果您无法成功上传像zip文件这样的二进制文件,请先处理上传文本文件 . 通过在文本编辑器中打开上载的内容,并检查它是否包含从客户端上载的文件的内容,您可以更轻松地验证服务器上文本文件的上载 . 完成此操作后,请转到二进制文件 . 然后,您可以使用DotNetZip读取流,转到完整的流式方法 . 一旦达到这一点,在将其作为zip文件读取之前,不需要将文件保存到文件系统,但是出于其他原因,您可能还是想保存它 .

    为了提供帮助,您可能希望使用调试HTTP代理Fiddler2 . 将它安装在浏览器计算机上,打开它,它将帮助您查看从浏览器发送到服务器上的ASPNET应用程序的消息 . 您将看到文件上载包含的内容仅仅是裸文件数据 .

  • -2

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

相关问题