web-dev-qa-db-ja.com

ASP.NET Web APIでダウンロードファイル名を設定する方法

ApiControllerクラスには、サーバーによって作成されたファイルをダウンロードする次のメソッドがあります。

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);
    }
}

デフォルトのダウンロードファイル名がそのIDであるため、すべてが完璧に機能しているため、ユーザーは毎回ダイアログとして保存するときに自分のファイル名を入力する必要があります。上記のコードにデフォルトのファイル名を設定する方法はありますか?

131
Tae-Sung Shin

HttpResponseMessageContent-Dispositionヘッダーを設定する必要があります。

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "foo.txt"
};
272
Darin Dimitrov

編集:コメントで述べたように、私の答えは;のようにエスケープする必要がある文字を考慮していません。ファイル名にセミコロンを含めることができる場合は、Darinが承認した回答を使用する必要があります。

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

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

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

26
KingPancake

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

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

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

7
sorenhk

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

Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
6
Jarek

ASP.NET Core MVCを使用している場合、上記の答えはこれまでに少し変更されています...

私のアクションメソッド(async Task<JsonResult>を返す)で、次の行を追加します(returnステートメントの前の任意の場所)。

Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
3
Peter

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

 response.StatusCode = HttpStatusCode.OK;
 response.Content = new StreamContent(result);
 response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
 return response;
3
Carl Raymond

これはする必要があります:

Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)
2
tucaz

注:最後の行は必須です。

Access-Control-Expose-Headersを指定しなかった場合、UIでファイル名は取得されません。

FileInfo file = new FileInfo(FILEPATH);

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = file.Name
};
response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
0
Chandan Y S