【问题标题】:DotNetZip download zip file from a webserviceDotNetZip 从网络服务下载 zip 文件
【发布时间】:2014-08-12 17:05:51
【问题描述】:

我正在尝试使用 c# 从 web 服务下载 zip 文件并在内存中提取一个条目,但是当我尝试读取流时,dotnetzip 文档中的内容如何,​​我得到异常“此流不支持“ZipFile.Read(stream)”部分中的寻求操作”。

谁能告诉我我做错了什么?提前致谢

urlAuthentication="https://someurl/?login=foo&token=faa"
var request = (HttpWebRequest)WebRequest.Create(urlAuthentication);

request.Proxy = WebRequest.DefaultWebProxy;
request.Credentials = System.Net.CredentialCache.DefaultCredentials; ;
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;


using (var ms = new MemoryStream())
{

   using (var response = (HttpWebResponse)request.GetResponse())
   {


      using (var stream =response.GetResponseStream())
      {

        using (ZipFile zipout = ZipFile.Read(stream))
        {
            ZipEntry entry = zipout["file1.xml"];
            entry.Extract(ms);
        }

      }
    }

}

【问题讨论】:

  • 其中的 zip 文件和 xml 的示例大小是多少?除了目标 xml 文件之外,zip 还包含很多内容吗?如果您将整个 zip 文件读入 MemoryStreambyte[],然后将其提供给 ZipFile 类,也许会更容易。
  • @TimS。 zip 文件大小为 17kb,分别有 182kb 和 25.3kb 两个文件(我要访问的条目是 182kb 之一)

标签: c# web-services dotnetzip


【解决方案1】:

显然dotnetzip需要一个流来支持seek操作,而HttpWebResponse的响应流不支持seek。

您可以通过先将整个文件下载到内存中,然后访问它来解决此问题:

using (var ms = new MemoryStream())
{
    using (MemoryStream seekable = new MemoryStream())
    {
        using (var stream = response.GetResponseStream())
        {
            int bytes;
            byte[] buffer = new byte[1024];
            while ((bytes = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                seekable.Write(buffer, 0, bytes);
            }
        }

        seekable.Position = 0;
        using (ZipFile zipout = ZipFile.Read(seekable))
        {
            ZipEntry entry = zipout["file1.xml"];
            entry.Extract(ms);
        }
    }

    // access ms
}

【讨论】:

猜你喜欢
  • 2018-12-26
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多