Как я могу генерировать и отправлять .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 и папку