2012-01-12 32 views
6

Tôi sử dụng DotNetZip để tạo lưu trữ zip bằng chuỗi bộ nhớ và tải xuống dưới dạng tệp đính kèm với mã sau.SharpZipLib tạo một tệp lưu trữ có chuỗi trong bộ nhớ và tải xuống dưới dạng tệp đính kèm

byte[] formXml = UTF8Encoding.Default.GetBytes("<form><pkg>Test1</pkg></form>"); 
byte[] formHtml = UTF8Encoding.Default.GetBytes("<html><body>Test2</body></html>"); 

ZipFile zipFile = new ZipFile(); 
zipFile.AddEntry("Form.xml", formXml); 
zipFile.AddEntry("Form.html", formHtml); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.AppendHeader("content-disposition", "attachment; filename=FormsPackage.zip"); 
zipFile.Save(Response.OutputStream); 
zipFile.Dispose(); 

Bây giờ tôi có yêu cầu làm tương tự với SharpZipLib. Tôi làm nó như thế nào ? SharpZipLib có hỗ trợ thêm tệp dưới dạng mảng byte không?

Trả lời

14

Hãy thử dưới đây

MemoryStream msFormXml = new MemoryStream(UTF8Encoding.Default.GetBytes("<form><pkg>Test1</pkg></form>")); 
MemoryStream msFormHTML = new MemoryStream(UTF8Encoding.Default.GetBytes("<html><body>Test2</body></html>")); 

MemoryStream outputMemStream = new MemoryStream(); 
ZipOutputStream zipStream = new ZipOutputStream(outputMemStream); 

zipStream.SetLevel(3); //0-9, 9 being the highest level of compression 

ZipEntry xmlEntry = new ZipEntry("Form.xml"); 
xmlEntry.DateTime = DateTime.Now; 
zipStream.PutNextEntry(xmlEntry); 
StreamUtils.Copy(msFormXml, zipStream, new byte[4096]); 
zipStream.CloseEntry(); 

ZipEntry htmlEntry = new ZipEntry("Form.html"); 
htmlEntry.DateTime = DateTime.Now; 
zipStream.PutNextEntry(htmlEntry); 
StreamUtils.Copy(msFormHTML, zipStream, new byte[4096]); 
zipStream.CloseEntry(); 

zipStream.IsStreamOwner = false; 
zipStream.Close(); 

outputMemStream.Position = 0; 

byte[] byteArray = outputMemStream.ToArray(); 

Response.Clear(); 
Response.AppendHeader("Content-Disposition", "attachment; filename=FormsPackage.zip"); 
Response.AppendHeader("Content-Length", byteArray.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.BinaryWrite(byteArray); 
+0

Cảm ơn. Điều này đã làm việc! – Dimuthu

+0

Vì vậy, khi yêu cầu kết thúc và tải xuống hoàn tất, bộ nhớ có được giải phóng không? Tôi cũng đang làm một cái gì đó rất giống nhau, và có thể có rất nhiều tập tin. Tôi cần xóa bộ nhớ sau khi yêu cầu hoàn tất. Tôi khá chắc chắn rằng các nhà sưu tập rác sẽ chăm sóc nó, nhưng tôi không chắc chắn 100%. – harsimranb

+0

Bộ thu gom rác thải được giả sử để làm điều đó. Nhưng đối với các kiểu dữ liệu như "MemoryStream", bạn phải gọi Dispose() hoặc sử dụng các câu lệnh "using" để đảm bảo bộ nhớ được giải phóng. –

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