在我的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之外,一切都工作正常,因此用户可能每次都需要在另存为对话框时键入他/她自己的文件名。有没有办法在上面的代码中设置默认文件名?
答案 0 :(得分:268)
您需要在Content-Disposition
上设置HttpResponseMessage
标题:
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "foo.txt"
};
答案 1 :(得分:26)
编辑:
正如评论中所述,我的回答并未考虑需要像;
一样进行转义的字符。如果您的文件名可能包含分号,则应使用Darin所接受的答案。
添加Response.AddHeader以设置文件名
Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");
只需将FILE_NAME更改为文件名即。
答案 2 :(得分:6)
我认为这对你有帮助。
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)
答案 3 :(得分:6)
如果您想确保文件名已正确编码,但也避免使用WebApi HttpResponseMessage,则可以使用以下内容:
Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());
您可以使用ContentDisposition或ContentDispositionHeaderValue。在任一实例上调用ToString将为您执行文件名编码。
答案 4 :(得分:3)
您需要将内容处置标头添加到响应中:
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
return response;
答案 5 :(得分:3)
如果您使用的是ASP.NET Core MVC,上面的答案会稍微改变一下......
在我的action方法(返回async Task<JsonResult>
)中,我添加了行(在return语句之前的任何位置):
Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");
答案 6 :(得分:2)
这应该做:
Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)
答案 7 :(得分:0)
注意:最后一行是必填项。
如果我们未指定 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");
答案 8 :(得分:0)
考虑到前面的答案,有必要小心使用全球化字符。
假设文件名为:“ Esdrújulaprendañame-güena.jpg”
原始结果下载:“EsdrÃjulaprendañame-gÃena.jpg” [丑陋]
HtmlEncode结果以下载:“ Esdr&_250; jula prenda&_241; ame-g&_252; ena.jpg” [丑]
UrlEncode结果以下载:“ Esdrújula+ prenda +ñame+-++güena.jpg” [确定]
然后,您几乎总是需要在文件名上使用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 类负责引用。