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存档并提取文件。在第34行中使用(ZipFile zip = ZipFile.Read(inputStream))" :ZipEntry :: ReadDirEntry():位置0x0000EE19处的错误签名(0xC618F879) 任何想法如何处理这个异常?
答案 0 :(得分: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文件一样。那不行。文件内容实际上嵌入了“......这里的更多东西......”部分。
为了解决这个问题,我建议你以更小的步骤工作。
首先,让文件上传工作,将上传文件的内容保存到服务器上的文件系统文件中。然后,在服务器上,尝试将文件作为zipfile打开。如果它工作,那么你应该能够用ZipFile.Read()替换文件保存部分。如果您无法打开保存的文件,则表示您保存的文件不是zip文件。要么它不完整,要么更有可能包括无关的数据,比如HTTP标头。
如果您无法成功上传像zip文件这样的二进制文件,请先处理上传文本文件的工作。通过在文本编辑器中打开上载的内容,并检查它是否包含从客户端上载的文件的内容,您可以更轻松地验证服务器上文本文件的上载。完成此操作后,请转到二进制文件。然后,您可以使用DotNetZip读取流,转到完整的流式方法。一旦你到达这一点,应该不需要将文件保存到文件系统,然后再将其作为zip文件读取,但出于其他原因,你可能还是想保存它。
要提供帮助,您可能需要使用调试HTTP代理Fiddler2。将它安装在浏览器计算机上,打开它,它将帮助您查看从浏览器发送到服务器上的ASPNET应用程序的消息。您将看到文件上载包含的内容仅仅是裸文件数据。
答案 1 :(得分:-2)
更稳定的解决方案可能是使用ICSharpCode ZipLib:http://www.sharpdevelop.net/OpenSource/SharpZipLib/Default.aspx