149

In my ApiController class, I have following method to download a file created by server.

public HttpResponseMessage Get(int id)
{
    try
    {
        string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
        Stream file = new MemoryStream();
        Stream result = _service.GetMyForm(id, dir, file);
        if (result == null)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }
        result.Position = 0;
        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.OK;
        response.Content = new StreamContent(result);
        return response;
    }
    catch (IOException)
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

Everything is working perfect except that default downloading file name is its id so user might have to type his/her own file name at save as dialog each time. Is there any way to set a default file name in the code above?

4

9 に答える 9

305

Content-Disposition次のヘッダーを設定する必要がありますHttpResponseMessage

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "foo.txt"
};
于 2012-08-27T16:06:10.003 に答える
28

編集:コメントで述べたように、私の答えは . のようにエスケープする必要がある文字を考慮していません;。ファイル名にセミコロンが含まれている可能性がある場合は、Darin が行った受け入れられた回答を使用する必要があります。

Response.AddHeader を追加してファイル名を設定します

Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");

FILE_NAME をファイルの名前に変更するだけです。

于 2012-08-27T16:03:30.590 に答える
9

ファイル名が適切にエンコードされていることを確認しながら、WebApi HttpResponseMessage を回避したい場合は、次を使用できます。

Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());

ContentDisposition または ContentDispositionHeaderValue のいずれかを使用できます。いずれかのインスタンスで ToString を呼び出すと、ファイル名のエンコードが行われます。

于 2016-09-12T07:18:37.027 に答える
6

これはあなたに役立つかもしれないと思います。

Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
于 2012-08-27T16:03:40.483 に答える
3

content-disposition ヘッダーを応答に追加する必要があります。

 response.StatusCode = HttpStatusCode.OK;
 response.Content = new StreamContent(result);
 response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
 return response;
于 2012-08-27T16:04:27.410 に答える
2

これは次のことを行う必要があります。

Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)
于 2012-08-27T16:04:41.703 に答える
0

以前の回答を考慮すると、グローバル化された文字には注意が必要です。

ファイルの名前が「Esdrújula prenda ñame - güena.jpg」であるとします。

ダウンロードする生の結果: "Esdrújula prenda ñame - güena.jpg" [醜い]

ダウンロードするHtmlEncode 結果: "Esdr&_250;jula prenda &_241;ame - g&_252;ena.jpg" [醜い]

ダウンロードするURL エンコード結果: " Esdrújula+prenda+ñame+-+güena.jpg " [OK]

次に、ほとんどの場合、ファイル名に対して UrlEncode を使用する必要があります。さらに、content-disposition ヘッダーを直接文字列として設定する場合は、ブラウザーの互換性の問題を回避するために引用符で囲む必要があります。

Response.AddHeader("Content-Disposition", $"attachment; filename=\"{HttpUtility.UrlEncode(YourFilename)}\"");

またはクラスエイド付き:

var cd = new ContentDisposition("attachment") { FileName = HttpUtility.UrlEncode(resultFileName) };
Response.AddHeader("Content-Disposition", cd.ToString());

System.Net.Mime。ContentDispositionクラスが引用符を処理します。

于 2019-10-31T18:44:28.603 に答える