c# — DotNetZip открывает zip-файл из MemoryStream

Что мне нравится делать, так это то, что вместо хранения zip-файла на диске мне нравится открывать его из MemoryStream.

Я просматриваю документацию для примера программирования DotNetZip: обратите внимание, что я немного изменил ее, основываясь на том, что, по моему мнению, может понадобиться.

    var ms = new MemoryStream();
    using (ZipFile zip = new ZipFile())
    {
       zip.AddFile("ReadMe.txt");
       zip.AddFile("7440-N49th.png");
       zip.AddFile("2008_Annual_Report.pdf");        
       zip.Save(ms); // this will save the files in memory steam
    }


  // now what I need is for the zip file to open up so that 
     the user can view all the files in it. Not sure what to do next after 
     zip.Save(ms) for this to happen. 

person Nate Pet    schedule 18.12.2012    source источник
comment
что ты имеешь ввиду под открытым? открыть в другой программе?   -  person Daniel A. White    schedule 18.12.2012
comment
Что такое окружающая среда? Вы делаете это, например, в ASP.NET MVC? Если это так, я могу опубликовать пример кода.   -  person Tom Chantler    schedule 18.12.2012
comment
@Dommer - Да, это в ASP.NET MVC C# - спасибо, это было бы очень полезно   -  person Nate Pet    schedule 18.12.2012
comment
@DanielA.White - Когда вы нажимаете на zip-файл, он открывается. Мне нужно сделать то же самое здесь.   -  person Nate Pet    schedule 18.12.2012
comment
Просто для протокола: это дополнительный вопрос к этот. Это может помочь прочитать это, чтобы лучше понять, что ищет @WebDev.   -  person Bobson    schedule 18.12.2012


Ответы (5)


Попробуй это:

public ActionResult Index()
{
    var memoryStream = new MemoryStream();

    using (var zip = new ZipFile())
    {
        zip.AddFile("ReadMe.txt");
        zip.AddFile("7440-N49th.png");
        zip.AddFile("2008_Annual_Report.pdf"); 
        zip.Save(memoryStream);
    }

    memoryStream.Seek(0, 0);
    return File(memoryStream, "application/octet-stream", "archive.zip");
}
person Chris Fulstow    schedule 18.12.2012
comment
мне нравится знать, почему нам нужно возвращать файл таким образом, потому что библиотека dotnetzip поддерживает запись zip-файла непосредственно в выходной поток. вот небольшой фрагмент zip.Save(Response.OutputStream);, который мог бы объяснить цель, почему вы возвращаете zip-файл клиенту таким образом return File(memoryStream, "application/octet-stream", "archive.zip"); пожалуйста, посмотрите мой пост здесь и ответьте на мой вопрос, если это возможно. Спасибо - person Mou; 22.04.2015

Если это локально. вам нужно будет сохранить поток в файл и вызвать для него Process.Start.

Если это на сервере. Просто напишите свою ms в Response с соответствующим типом mime.

person Kugel    schedule 18.12.2012

Вам нужно будет отправить содержимое потока памяти обратно в качестве ответа:

using (MemoryStream ms = new MemoryStream())
{
    using (ZipFile zip = new ZipFile())
    {
       zip.AddFile("ReadMe.txt");
       zip.AddFile("7440-N49th.png");
       zip.AddFile("2008_Annual_Report.pdf");        
       zip.Save(ms); // this will save the files in memory steam
    }

    context.Response.ContentType = "application/zip";
    context.Response.AddHeader("Content-Length", ms.Size);
    context.Response.AddHeader("Content-disposition", "attachment; filename=MyZipFile.zip");
    ms.Seek(0, SeekOrigin.Begin);
    ms.WriteTo(context.Response.OutputStream);
}
person Thorsten Dittmar    schedule 18.12.2012

Попробуйте создать ActionResult примерно так: я не уверен на 100% в строке var fileData = ms;, и сейчас у меня нет доступа к среде разработки, но вам должно хватить, чтобы разобраться.

public ActionResult DownloadZip()
{
    using (MemoryStream ms = new MemoryStream())
    {
      using (ZipFile zip = new ZipFile())
      {
         zip.AddFile("ReadMe.txt");
         zip.AddFile("7440-N49th.png");
         zip.AddFile("2008_Annual_Report.pdf");        
         zip.Save(ms); // this will save the files in memory steam
      }
      byte[] fileData = ms.GetBuffer();// I think this will work. Last time I did it, I did something like this instead... Zip.CreateZip("LogPosts.csv", System.Text.Encoding.UTF8.GetBytes(csv));
      var cd = new System.Net.Mime.ContentDisposition
      {
          FileName = "Whatever.zip",
          // always prompt the user for downloading, set to true if you want 
          // the browser to try to show the file inline
          Inline = false,
      };
      Response.AppendHeader("Content-Disposition", cd.ToString());
      return File(fileData, "application/octet-stream");
      }
  }
person Tom Chantler    schedule 18.12.2012
comment
Я думаю, что рассматриваемая строка должна быть byte[] fileData = ms.GetBuffer();. - person Thorsten Dittmar; 18.12.2012
comment
Спасибо, Доммер. Позвольте мне попробовать! - person Nate Pet; 18.12.2012

таким образом мы можем записать zip в выходной поток. может помочь

ZipFile zip = new ZipFile();
     List<Attachment> listattachments = email.Attachments;
        int acount = attachments.Count;
        for (int i = 0; i < acount; i++)
        {
            zip.AddEntry(attachments[i].FileName, listattachments[i].Content);
        }
        Response.Clear();
        Response.BufferOutput = false;
        string zipName = String.Format("{0}.zip", message.Headers.From.DisplayName);
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
        zip.Save(Response.OutputStream);
        Response.End();     
person Mou    schedule 22.04.2015