Как я могу генерировать и отправлять .zip файл пользователю в С# ASP.NET?

Мне нужно создать и отправить zip пользователю.

Я видел примеры, делающие то или другое, но не оба, и мне любопытно, есть ли какие-либо "лучшие практики" или что-то еще.

Извините за путаницу. Я собираюсь создать zip "на лету" для веб-пользователя и отправить его им в ответ HTTP. Не в электронном письме.

Марк

Ответ 1

Я бы предпочел голосовать за SharpZipLib, чтобы создать Zip файл. Затем вы захотите добавить заголовок ответа к выходу, чтобы принудительно установить диалог загрузки.

http://aspalliance.com/259

должен дать вам хорошую отправную точку для достижения этого. Вам в основном нужно добавить заголовок ответа, задать тип контента и записать файл в выходной поток:

Response.AppendHeader( "content-disposition", "attachment; filename=" + name );
Response.ContentType = "application/zip";
Response.WriteFile(pathToFile);

Эта последняя строка может быть изменена на Response.Write(filecontents), если вы не хотите сохранять временный файл.

Ответ 2

DotNetZip позволяет делать это легко, без записи в файл диска на сервере. Вы можете напрямую записать zip-архив в поток Response, что приведет к появлению диалогового окна загрузки в браузере.

Пример кода ASP.NET для DotNetZip

Еще пример кода ASP.NET для DotNetZip

надрез:

    Response.Clear();
    Response.BufferOutput = false; // false = stream immediately
    System.Web.HttpContext c= System.Web.HttpContext.Current;
    String ReadmeText= String.Format("README.TXT\n\nHello!\n\n" + 
                                     "This is text for a readme.");
    string archiveName= String.Format("archive-{0}.zip", 
                                      DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "filename=" + archiveName);

    using (ZipFile zip = new ZipFile())
    {
        zip.AddFiles(f, "files");            
        zip.AddFileFromString("Readme.txt", "", ReadmeText);
        zip.Save(Response.OutputStream);
    }
    Response.Close();

или в VB.NET:

    Response.Clear
    Response.BufferOutput= false
    Dim ReadmeText As String= "README.TXT\n\nHello!\n\n" & _
                              "This is a zip file that was generated in ASP.NET"
    Dim archiveName as String= String.Format("archive-{0}.zip", _
               DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"))
    Response.ContentType = "application/zip"
    Response.AddHeader("content-disposition", "filename=" + archiveName)

    Using zip as new ZipFile()
        zip.AddEntry("Readme.txt", "", ReadmeText, Encoding.Default)
        '' filesToInclude is a string[] or List<String>
        zip.AddFiles(filesToInclude, "files")            
        zip.Save(Response.OutputStream)
    End Using
    Response.Close

Ответ 3

Я уверен, что другие порекомендуют SharpZipLib

Как вы собираетесь "отправить" его..NET имеет встроенные библиотеки для электронной почты через SMTP

ИЗМЕНИТЬ

В этом случае вы захотите захватить выходной поток из SharpZipLib и записать его непосредственно в Response. Просто убедитесь, что у вас есть правильный Mimetype, заданный в заголовках ответов (application/zip), и убедитесь, что вы не выполняете Response.Write что-нибудь еще для пользователя.

Ответ 4

Согласитесь с выше, SharpZipLib, для создания .zip файлов в .NET это кажется очень популярным вариантом.

Что касается "отправки", если вы имеете в виду через SMTP/Email, вам нужно будет использовать пространство имен System.Net.Mail. System.Net.Mail.Attachment В документации по классу приведен пример отправки файла по электронной почте

Запишите выше, к тому времени, когда я разместил это, я вижу, что вы имели в виду возврат через HTTP-ответ.

Ответ 5

Одной из проблем является размер файла, который будет передаваться клиенту. Если вы используете SharpZipLib для создания ZIP-памяти, у вас нет временных файлов для очистки, но вы скоро столкнетесь с проблемами памяти, если файлы большие, а несколько одновременных пользователей загружают файлы. (Мы довольно часто это испытывали, когда размеры ZIP достигали диапазона 200 МБ +.) Я работал над этим с помощью файла temp на диск, передавая его пользователю и удаляя его, когда запрос завершен.

Ответ 6

DotNetZip создает поток без сохранения каких-либо ресурсов на сервере, поэтому вам не нужно ничего запоминать. Как я уже говорил, это быстрое и интуитивно понятное кодирование с эффективной реализацией.

Моше

Ответ 7

Я изменил некоторые коды, как показано ниже, я использую System.IO.Compression

 public static void Zip(HttpResponse Response, HttpServerUtility Server, string[] pathes)
    {
        Response.Clear();
        Response.BufferOutput = false;         

        string archiveName = String.Format("archive-{0}.zip",
                                          DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
        Response.ContentType = "application/zip";
        Response.AddHeader("content-disposition", "filename=" + archiveName);

        var path = Server.MapPath(@"../TempFile/TempFile" + DateTime.Now.Ticks);
        if (!Directory.Exists(Server.MapPath(@"../TempFile")))
            Directory.CreateDirectory(Server.MapPath(@"../TempFile"));

        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        var pathzipfile = Server.MapPath(@"../TempFile/zip_" + DateTime.Now.Ticks + ".zip");
        for (int i = 0; i < pathes.Length; i++)
        {
            string dst = Path.Combine(path, Path.GetFileName(pathes[i]));
            File.Copy(pathes[i], dst);
        }
        if (File.Exists(pathzipfile))
            File.Delete(pathzipfile);
        ZipFile.CreateFromDirectory(path, pathzipfile);
        {
            byte[] bytes = File.ReadAllBytes(pathzipfile);
            Response.OutputStream.Write(bytes, 0, bytes.Length);
        }
        Response.Close();
        File.Delete(pathzipfile);
        Directory.Delete(path, true);
    }  

этот код получает список, содержащий список файлов, которые копируют их в папку temp , создайте zip файл temp, затем прочитайте все байты этого файла и отправьте байты в потоке ответов, окончательный файл temp и папку