C#ASP.NETで.zipファイルを生成してユーザーに送信するにはどうすればよいですか?
質問
zipを作成してユーザーに送信する必要があります。
どちらか一方を実行する例を見たことがありますが、両方ではありません。「ベストプラクティス」などがあるかどうか興味があります。
混乱をおかけして申し訳ありません。 Webユーザーのためにzipをその場で生成し、HTTP応答でそれらに送信します。メールではありません。
マーク
解決
2番目に SharpZipLib に投票して、Zipファイルを作成します。次に、応答ダイアログを出力に追加して、ダウンロードダイアログを強制します。
それを達成するための良い出発点を提供すべきです。基本的に、応答ヘッダーを追加し、コンテンツタイプを設定し、ファイルを出力ストリームに書き込む必要があります。
Response.AppendHeader( "content-disposition", "attachment; filename=" + name );
Response.ContentType = "application/zip";
Response.WriteFile(pathToFile);
一時ファイルに保存したくない場合は、最後の行をResponse.Write(filecontents)に変更できます。
他のヒント
DotNetZip を使用すると、サーバー上のディスクファイルに書き込むことなく、これを簡単に行うことができます。 Responseストリームに直接zipアーカイブを書き込むことができます。これにより、ダウンロードダイアログがブラウザーに表示されます。
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();
または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
他の人が SharpZipLib
を推奨するはずです。どのように「送信」するつもりですか?それ。 .NETには、SMTP経由の電子メール用のライブラリが組み込まれています
編集
その場合、SharpZipLibから出力ストリームをキャプチャし、Responseに直接書き込みます。応答ヘッダー(application / zip)に正しいMimetypeが設定されていることを確認し、Response.Writeを行わないことを確認してください。
上記に同意します。 SharpZipLib 。非常に一般的なオプションのようです。
「送信」に関しては、SMTP / Email経由の場合は、System.Net.Mail名前空間を使用する必要があります。 System.Net.Mail.Attachment クラスのドキュメントには、メールでファイルを送信する方法の例があります
上記をスクラッチしてください。これを投稿するまでに、HTTPレスポンス経由で戻ることを意味していることがわかります。
1つの懸念は、クライアントにストリーミングするファイルのサイズです。 SharpZipLibを使用してZIPインメモリをビルドする場合、クリーンアップする一時ファイルはありませんが、ファイルが大きく、多数の同時ユーザーがファイルをダウンロードしている場合、すぐにメモリの問題が発生します。 (これは、ZIPサイズが200 MB以上の範囲に達したときにかなり頻繁に発生しました。)一時ファイルをディスクに保存し、ユーザーにストリーミングし、リクエストが完了したら削除します。
DotNetZipはサーバー上のリソースを保存せずにストリームを作成するため、何も消去する必要はありません。前に言ったように、効率的実装を備えた高速で直感的なコーディング。
モシェ
以下のようにいくつかのコードを変更しました。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ファイルを作成し、そのファイルのすべてのバイトを読み取り、応答ストリームでバイトを送信し、最終的に一時ファイルとフォルダーを削除します