Как мне сгенерировать и отправить файл .zip пользователю в C # ASP.NET? - PullRequest
11 голосов
/ 07 мая 2009

Мне нужно создать и отправить пользователю почтовый индекс.

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

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

Mark

Ответы [ 7 ]

20 голосов
/ 07 мая 2009

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

http://aspalliance.com/259

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

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

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

10 голосов
/ 08 мая 2009

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

Пример кода 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
2 голосов
/ 07 мая 2009

Я уверен, что другие будут рекомендовать SharpZipLib

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

EDIT

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

0 голосов
/ 09 июля 2016

Я изменил некоторые коды, как показано ниже, я использую 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);
    }  

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

0 голосов
/ 26 июля 2009

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

Моше

0 голосов
/ 06 июля 2009

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

0 голосов
/ 07 мая 2009

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

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

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

...