C#ASP.NETで.zipファイルを生成してユーザーに送信するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/834527

  •  08-07-2019
  •  | 
  •  

質問

zipを作成してユーザーに送信する必要があります。

どちらか一方を実行する例を見たことがありますが、両方ではありません。「ベストプラクティス」などがあるかどうか興味があります。

混乱をおかけして申し訳ありません。 Webユーザーのためにzipをその場で生成し、HTTP応答でそれらに送信します。メールではありません。

マーク

役に立ちましたか?

解決

2番目に SharpZipLib に投票して、Zipファイルを作成します。次に、応答ダイアログを出力に追加して、ダウンロードダイアログを強制します。

http://aspalliance.com/259

それを達成するための良い出発点を提供すべきです。基本的に、応答ヘッダーを追加し、コンテンツタイプを設定し、ファイルを出力ストリームに書き込む必要があります。

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

一時ファイルに保存したくない場合は、最後の行をResponse.Write(filecontents)に変更できます。

他のヒント

DotNetZip を使用すると、サーバー上のディスクファイルに書き込むことなく、これを簡単に行うことができます。 Responseストリームに直接zipアーカイブを書き込むことができます。これにより、ダウンロードダイアログがブラウザーに表示されます。

DotNetZip用のASP.NETコードの例

DotNetZipのASP.NETコードの例

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ファイルを作成し、そのファイルのすべてのバイトを読み取り、応答ストリームでバイトを送信し、最終的に一時ファイルとフォルダーを削除します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top