44

ユーザーがボタンをクリックした後、ファイルをダウンロードしたい。うまくいくように見える次のことを試しましたが、受け入れられない例外 (ThreadAbort) をスローしないわけではありません。

    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.ClearContent();
    response.Clear();
    response.ContentType = "text/plain";
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ";");
    response.TransmitFile(Server.MapPath("FileDownload.csv"));
    response.Flush();
    response.End();  
4

6 に答える 6

85

次のように、HTTP ハンドラー (.ashx) を使用してファイルをダウンロードできます。

ダウンロードファイル.ashx:

public class DownloadFile : IHttpHandler 
{
    public void ProcessRequest(HttpContext context)
    {   
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/plain";
        response.AddHeader("Content-Disposition", 
                           "attachment; filename=" + fileName + ";");
        response.TransmitFile(Server.MapPath("FileDownload.csv"));
        response.Flush();    
        response.End();
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

次に、次のように、ボタン クリック イベント ハンドラーから HTTP ハンドラーを呼び出すことができます。

マークアップ:

<asp:Button ID="btnDownload" runat="server" Text="Download File" 
            OnClick="btnDownload_Click"/>

コード ビハインド:

protected void btnDownload_Click(object sender, EventArgs e)
{
    Response.Redirect("PathToHttpHandler/DownloadFile.ashx");
}

パラメータを HTTP ハンドラに渡す:

Response.Redirect()次のように、クエリ文字列変数を に単純に追加できます。

Response.Redirect("PathToHttpHandler/DownloadFile.ashx?yourVariable=yourValue");

次に、実際のハンドラー コードで、次のようにRequestオブジェクトを使用しHttpContextて、クエリ文字列変数の値を取得できます。

System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;
string yourVariableValue = request.QueryString["yourVariable"];

// Use the yourVariableValue here

- ファイル名をクエリ文字列パラメーターとして渡して、実際のファイルが何であるかをユーザーに提案するのが一般的です。この場合、名前の値を [名前を付けて保存...] で上書きできます。

于 2013-08-28T01:26:39.347 に答える
2

以下のように変更し、サーバーのコンテンツ タイプを次のように再デプロイします。

Response.ContentType = "application/octet-stream";

これは私にとってはうまくいきました。

Response.Clear(); 
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
Response.AddHeader("Content-Length", file.Length.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.WriteFile(file.FullName); 
Response.End();
于 2015-07-22T13:55:48.390 に答える
1

Karl Anderson のソリューションに加えて、パラメーターをセッション情報に入れ、response.TransmitFile(Server.MapPath( Session(currentSessionItemName)));.

セッションの詳細については、 MSDN ページのHttpSessionState.Add メソッド (文字列、オブジェクト)を参照してください。

于 2014-09-01T09:56:56.903 に答える
0

サーバーからファイルをダウンロードするための簡単なソリューション:

protected void btnDownload_Click(object sender, EventArgs e)
        {
            string FileName = "Durgesh.jpg"; // It's a file name displayed on downloaded file on client side.

            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
            response.ClearContent();
            response.Clear();
            response.ContentType = "image/jpeg";
            response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
            response.TransmitFile(Server.MapPath("~/File/001.jpg"));
            response.Flush();
            response.End();
        }
于 2016-03-17T17:51:51.183 に答える