[英]How to set downloading file name in 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,因此用户可能必须每次在另存为对话框时键入他/她自己的文件名。 有没有办法在上面的代码中设置默认文件名?
您需要在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)
您需要将 content-disposition 标头添加到响应中:
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
return response;
如果您使用的是 ASP.NET Core MVC,上面的答案会略有改变......
在我的操作方法(返回async Task<JsonResult>
)中,我添加了以下行(在 return 语句之前的任何位置):
Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
这应该做:
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");
考虑到前面的答案,有必要小心使用全球化字符。
假设文件名是:“ Esdrújula prenda ñame - güena.jpg ”
要下载的原始结果:“Esdrújula prenda ñame - güena.jpg”[丑陋]
HtmlEncode结果下载:“Esdr&_250;jula prenda &_241;ame - g&_252;ena.jpg”【丑】
UrlEncode下载结果:“ Esdrújula+prenda+ñame+-+güena.jpg ” [OK]
然后,您几乎总是需要在文件名上使用 UrlEncode 。 此外,如果您将 content-disposition 标头设置为直接字符串,那么您需要确保用引号引起来以避免浏览器兼容性问题。
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。 ContentDisposition类负责引号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.