如何在 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 之外,一切工作都很完美,因此用户可能每次都必须在另存为对话框时键入他/她自己的文件名。有没有办法在上面的代码中设置默认文件名?

113769 次浏览

编辑: 正如在评论中提到的,我的答案没有考虑到需要像 ;那样转义的字符。如果您的文件名可以包含分号,那么您应该使用 Darin 提供的公认答案。

添加一个 Response. AddHeader 以设置文件名

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

只需将 FILE _ NAME 更改为文件名即可。

我觉得这可能对你有帮助。

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

您需要将内容处理标头添加到响应中:

 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)

您需要在 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"
};

如果您希望确保文件名被正确编码,同时避免使用 WebApi HttpResponseMessage,可以使用以下方法:

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

可以使用 ContentDisposition 或 ContentDispostionHeaderValue。对其中一个实例调用 ToString 将为您编码文件名。

如果您使用的是 ASP.NET Core MVC,那么上面的答案会稍微有所改变..。

在 action 方法(返回 async Task<JsonResult>)中,我添加了这一行(在 return 语句之前的任何位置) :

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

注意: 最后一行是强制性的。

如果我们没有指定 < em > 存取控制-公开标题 ,我们将不会得到 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");

考虑到前面的答案,有必要对全球化字符加以注意。

假设文件名是: “ Esdrújula pranda ñame-güena.jpg

原始 下载结果: “ Esdríojula prenda ñame-gÃ4ena.jpg”[ Ugly ]

下载: “ Esdr & _ 250; jula prenda & _ 241; ame-g & _ 252; ena.jpg”[ Ugly ]

UrlEncode result 下载: “ Esdrújula + pranda + ñame +-+ güena.jpg”[ OK ]

然后,你需要 几乎总是在文件名上使用 UrlEncode。 此外,如果将内容处理标头设置为直接字符串,则 然后你需要确保用引号包围可以避免浏览器兼容性问题。

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.内容处置类负责引号。