如何在ASP.NET Web API中设置下载文件的名称

在我的ApiController类中,我有以下方法来下载由服务器创build的文件。

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以外,所有的工作都很完美,所以用户可能必须每次input他/她自己的文件名。 有没有办法在上面的代码中设置默认的文件名?

您需要在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更改为文件的名称。

我认为这可能对你有帮助。

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

您需要将content-disposition标头添加到响应中:

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

如果您要确保文件名正确编码,但也避免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="+ YourFilename) 

如果你正在使用ASP.NET Core MVC,上面的答案是如此轻微改变…

在我的行动方法(它返回async Task<JsonResult> )我添加行(在返回语句之前的任何地方):

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