咨询区
Tae-Sung Shin:
在我的 ApiController 类中,有一个下载文件的Action方法,代码如下:
public HttpResponseMessage Get(int id)
{try{string dir = HttpContext.Current.Server.MapPath("~"); //location of the template fileStream 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,导致用户每次在对话框中保存的时候都需要修改成语义化的名字,我的想法是能不能在 API 端直接设置成默认名字呢?
回答区
Darin Dimitrov:
这个很简单,在 HttpResponseMessage 的 header 中设置一下 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"
};
sorenhk:
只要确保你的文件名是一个正确编码的格式,而且你也不想用 WebApi 的 HttpResponseMessage 的话,推荐直接设置 Response, 参考如下代码:
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());
或者这样:
Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
点评区
这种需求在 webapi 开发中还是蛮容易遇到的,不管什么途径最终都是设置 Content-Disposition
,学习了。