2009-08-13 7 views
1

私はいくつかのファイルを追加したい既存のZIPファイル(いくつかのファイル)を持っています。asp.netファイルを解凍してユーザーにアップロードする方法

ユーザーがダウンロードボタンをクリックすると、このZIPをちょっと変更してブラウザへのダウンロードを開始する必要があります。 (そこもちろん一度に複数のユーザーであることができ、かつそれぞれ1つの必要性は少し異なったzipファイルを受信する。)

zipファイルに

答えて

3

ルックを変更するasp.netでの機能/ライブラリのこの種がありますこのときthread

GZIPフォーマットは、文書化された標準フォーマットです。複数のファイルを1つのアーカイブに入れることをサポートしていますが、ほとんどのGZIPツールでは1つのファイルしか含まれていない圧縮ファイル(.gz)が生成されます。通常、ルートファイル名は同じであるため、Datafile.csvを圧縮すると、Datafile.csv.gzというファイルが作成されます。

GZIP形式は、.zip形式と同じではありません。 GZipStreamクラスはGZIP形式のファイルを読み書きできますが、クラスは.zipファイルを生成または読み込みません。このクラスのドキュメントでは次のことが明確に記載されています:

このクラスは、または.zipアーカイブからファイルを抽出する。

GZipStreamの助けを借りて、余分なコードを使ってzipファイルを生成したり読むことは可能ですが、それは簡単なことではありません。

Zipファイルを読み書きする場合は、DotNetZipなどのサードパーティライブラリを使用するのが最善の方法です。このライブラリは無料であり、複数の圧縮ファイルを含むzipファイルをアプリケーションが読み書きできるようにします。これらはWindowsエクスプローラ、WinZip、または他のzipツールで開くことができる標準のzipファイルです。使い方は簡単です。ダウンロードの問題については

Response.Clear(); 
    String ReadmeText= "README.TXT\n\nHello!\n\nThis is a zip file that was dynamically generated."; 
    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()) 
    { 
    // add a named entry to the zip file, using a string for content 
    zip.AddFileFromString("Readme.txt", "", ReadmeText); 
    if (!String.IsNullOrEmpty(tbPassword.Text)) 
    { 
     zip.Password = tbPassword.Text; 
     if (chkUseAes.Checked) 
     zip.Encryption = EncryptionAlgorithm.WinZipAes256; 
    } 

    // add a bunch of plain files, into the "files" directory 
    foreach (var f in filesToInclude) 
    { 
     zip.AddFile(f, "files"); 
    } 
    zip.Save(Response.OutputStream); 
    } 
    Response.End(); 
+0

dotnetzipを使用したコード例も同様ですか?既存のzipファイルにファイルを追加するために使用できますか? – Tom

+0

私はそれについてはわかりませんが、これはかなり一般的なシナリオだと思うし、可能でなければならないと思います。 –

0

私はあなたが(AJAXの場合)iframe内に移入しまうのダウンロードページにこのコードを掲載しました。ストリームコードは、AJAXを使用しない場合にのみ使用できます。もちろん

Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Data.Sql 
Imports System.Net 
Imports system.io 

Partial Class DownloadFile 
Inherits System.Web.UI.Page 

Protected Sub page_load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
Dim url As String = Request.QueryString("DownloadUrl") 
If url Is Nothing Or url.Length = 0 Then Exit Sub 

'Initialize the input stream 
Dim req As HttpWebRequest = WebRequest.Create(url) 
Dim resp As HttpWebResponse = req.GetResponse() 
Dim bufferSize As Integer = 1 

'Initialize the output stream 
Response.Clear() 
Response.AppendHeader("Content-Disposition:", "attachment; filename=download.zip") 
Response.AppendHeader("Content-Length", resp.ContentLength.ToString) 
Response.ContentType = "application/download" 

'Populate the output stream 
Dim ByteBuffer As Byte() = New Byte(bufferSize) {} 
Dim ms As MemoryStream = New MemoryStream(ByteBuffer, True) 
Dim rs As Stream = req.GetResponse.GetResponseStream() 
Dim bytes() As Byte = New Byte(bufferSize) {} 
While rs.Read(ByteBuffer, 0, ByteBuffer.Length) > 0 
Response.BinaryWrite(ms.ToArray()) 
Response.Flush() 
End While 

'Cleanup 
Response.End() 
ms.Close() 
ms.Dispose() 
rs.Dispose() 
ByteBuffer = Nothing 
End Sub 
End Class 

zipファイルがパブリックアクセス権を持っている場合、あなたは単に<のhref ... & GT>を行うことができます。

0

.NET 3.5を使用している場合は、ファイルをzipアーカイブに追加/削除することができます。 .NET 2.0を使用している場合は、SharpZipLibなどのライブラリを使用する必要があります。

関連する問題