DotNetZip失败,“流不支持搜索操作”

时间:2014-10-10 04:01:27

标签: c# asp.net-mvc stream dotnetzip

我在C#中使用DotNetZip从流中解压缩如下:

public static void unzipFromStream(Stream stream, string outdir)
{   //omit try catch block
    using (ZipFile zip = ZipFile.Read(stream)){
        foreach (ZipEntry e in zip){
            e.Extract(outdir, ExtractExistingFileAction.OverwriteSilently);
        }
    }
}

使用

获取流
WebClient client = new WebClient();
Stream fs = client.OpenRead(url);

但是,我得到了以下异常

exception during extracting zip from stream System.NotSupportedException: This stream does not support seek operations.
at System.Net.ConnectStream.get_Position()
at Ionic.Zip.ZipFile.Read(Stream zipStream, TextWriter statusMessageWriter, Encoding encoding, EventHandler`1 readProgress)

在服务器端(ASP.NET MVC 4),返回FilePathResultFileStreamResult都会导致此异常。

我应该在客户端获得不同的流吗?或者如何让服务器返回"可搜索的"流?谢谢!

1 个答案:

答案 0 :(得分:5)

您必须将数据下载到文件或内存,然后创建FileStreamMemoryStream或其他支持搜索的流类型。例如:

WebClient client = new WebClient();
client.DownloadFile(url, filename);
using (var fs = File.OpenRead(filename))
{
    unzipFromStream(fs, outdir);
}
File.Delete(filename);

或者,如果数据适合内存:

byte[] data = client.DownloadData(url);
using (var fs = new MemoryStream(data))
{
    unzipFromStream(fs, outdir);
}