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

时间:2012-08-27 15:59:43

标签: c# 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之外,一切都工作正常,因此用户可能每次都需要在另存为对话框时键入他/她自己的文件名。有没有办法在上面的代码中设置默认文件名?

9 个答案:

答案 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 类负责引用。