2009-05-07 28 views
10

Tôi cần phải tạo và gửi mã zip cho người dùng.Làm cách nào để tạo và gửi tệp .zip cho người dùng trong C# ASP.NET?

Tôi đã xem các ví dụ làm việc này hay cách khác, chứ không phải cả hai, và tò mò nếu có bất kỳ 'thực hành tốt nhất' hay bất cứ điều gì.

Xin lỗi vì sự nhầm lẫn. Tôi sẽ tạo ra các zip trên bay cho người sử dụng web, và gửi nó cho họ trong phản ứng HTTP. Không có trong email.

Đánh dấu

Trả lời

18

Tôi sẽ bỏ phiếu thứ hai cho số SharpZipLib để tạo tệp Zip. Sau đó, bạn sẽ muốn thêm một tiêu đề phản hồi vào đầu ra để buộc hộp thoại tải xuống.

http://aspalliance.com/259

sẽ cung cấp cho bạn một điểm khởi đầu tốt để đạt được điều đó. Về cơ bản bạn cần phải thêm một tiêu đề phản ứng, thiết lập các kiểu nội dung và ghi các file vào dòng đầu ra:

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

Đó dòng cuối cùng có thể được thay đổi thành một Response.Write (filecontents) nếu bạn không muốn lưu vào một tập tin tạm thời.

+0

http://aspalliance.com/259 đã chết. –

2

tôi chắc chắn rằng những người khác sẽ khuyên SharpZipLib

Làm thế nào bạn có ý định "gửi" nó. NET đã xây dựng trong thư viện cho email qua SMTP

EDIT

Trong trường hợp đó bạn sẽ muốn nắm bắt các dòng đầu ra từ SharpZipLib và viết nó trực tiếp đến việc đáp ứng. Chỉ cần đảm bảo bạn đã đặt đúng Mimetype trong Tiêu đề phản hồi (ứng dụng/zip) và đảm bảo bạn không phản hồi.Giết bất kỳ điều gì khác cho người dùng.

0

Đồng ý với ở trên, SharpZipLib, để tạo tệp .zip trong .NET, có vẻ như đây là tùy chọn rất phổ biến.

Đối với 'gửi', nếu bạn muốn nói qua SMTP/Email, bạn sẽ cần sử dụng không gian tên System.Net.Mail. Tài liệu về lớp học System.Net.Mail.Attachment có ví dụ về cách gửi tệp qua email

Làm xước ở trên, vào thời điểm tôi đăng này tôi thấy bạn có nghĩa là trả lại qua phản hồi HTTP.

9

DotNetZip cho phép bạn thực hiện việc này dễ dàng, không bao giờ ghi vào tệp đĩa trên máy chủ. Bạn có thể viết lưu trữ zip trực tiếp ra luồng Trả lời, điều này sẽ làm cho hộp thoại tải xuống bật lên trên trình duyệt.

Example ASP.NET code for DotNetZip

More example ASP.NET code for DotNetZip

snip:

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(); 

hoặc trong 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 
+0

Cho đến nay thư viện ZIP tốt nhất cho C# – kape123

+0

Tính đến tháng 9 năm 2014 (và .Net 4.5) DotNetZip hiện không đáng tin cậy, thường sản xuất lưu trữ zip bị hỏng hoặc không thể mở được. Một sự xấu hổ, vì nó đã được làm việc đẹp mắt trong năm đầu tiên hoặc vì vậy mà tôi đã có nó. –

0

Một mối quan tâm là kích thước của các tập tin mà bạn sẽ được truyền đến khách hàng.Nếu bạn sử dụng SharpZipLib để xây dựng ZIP trong bộ nhớ, bạn không có bất kỳ tệp tạm thời nào để dọn dẹp, nhưng bạn sẽ sớm gặp phải vấn đề về bộ nhớ nếu các tệp lớn và một số người dùng đồng thời đang tải xuống tệp. (Chúng tôi đã trải nghiệm điều này khá thường xuyên khi kích thước ZIP đạt đến phạm vi 200 MB +). Tôi đã làm việc này bằng tệp tạm thời vào đĩa, truyền trực tuyến tới người dùng và xóa nó khi yêu cầu hoàn tất.

0

DotNetZip tạo luồng mà không lưu bất kỳ tài nguyên nào trên máy chủ, do đó bạn không phải nhớ xóa bất kỳ thứ gì. Như tôi đã nói, mã hóa nhanh và trực quan của nó, với việc thực hiện hiệu quả.

Moshe

0

tôi sửa đổi một số mã như dưới đây, tôi sử dụng 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); 
    } 

mã này được một số danh sách có chứa danh sách các tập tin sao chép chúng vào thư mục tạm thời , tạo file zip tạm thời sau đó đọc tất cả các byte của tệp đó và gửi byte trong luồng phản hồi, cuối cùng xóa tệp tạm thời và thư mục

Các vấn đề liên quan