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であるため、すべてが完璧に機能しているため、ユーザーは毎回ダイアログとして保存するときに自分のファイル名を入力する必要があります。上記のコードにデフォルトのファイル名を設定する方法はありますか?
HttpResponseMessage
にContent-Disposition
ヘッダーを設定する必要があります。
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.txt"
};
編集:コメントで述べたように、私の答えは;
のようにエスケープする必要がある文字を考慮していません。ファイル名にセミコロンを含めることができる場合は、Darinが承認した回答を使用する必要があります。
Response.AddHeaderを追加してファイル名を設定します
Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");
FILE_NAMEをファイルの名前に変更するだけです。
ファイル名が適切にエンコードされていることを確認したいが、WebApi HttpResponseMessageも回避したい場合は、次を使用できます。
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());
ContentDispositionまたはContentDispositionHeaderValueを使用できます。いずれかのインスタンスでToStringを呼び出すと、ファイル名のエンコードが行われます。
これはあなたに役立つと思います。
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
ASP.NET Core MVCを使用している場合、上記の答えはこれまでに少し変更されています...
私のアクションメソッド(async Task<JsonResult>
を返す)で、次の行を追加します(returnステートメントの前の任意の場所)。
Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
応答にcontent-dispositionヘッダーを追加する必要があります。
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
return response;
これはする必要があります:
Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)
注:最後の行は必須です。
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");