如何从ASP.NET WebAPI强制下载文件

时间:2012-12-03 09:02:57

标签: jquery asp.net asp.net-mvc rest asp.net-web-api

这是我的web-api代码:

    [HttpPost]
    public HttpResponseMessage PostFileAsAttachment()
    {
        string path = "D:\\heroAccent.png";
        if (File.Exists(path))
        {

            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new FileStream(path, FileMode.Open);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = "xx.png";
            return result;
        }
        return new HttpResponseMessage(HttpStatusCode.NotFound);
    }

如何编写客户端(视图)强制下载文件给我(如自动下载模式(打开,另存为)可以弹出...)

2 个答案:

答案 0 :(得分:2)

如上所述,您无法从ajax触发“打开/另存为”对话框。

如果您想在下载文件时保留当前页面内容,可以在页面的某处添加隐藏的iframe,并让您的下载链接在幕后执行一些JS来设置 src 属性把iframe说到适当的位置。

$('iframeSelector').attr('src', downloadLinkLocation)

我已经使用返回 FileContentResult 的操作对此进行了测试,但如果您在响应标头中设置了 ContentDisposition ,就像您一样,我认为没有理由说它不会使用WebAPI方法。

答案 1 :(得分:0)

可用于文件的ActionResult类型之一是FileResult 如果要传输的内容存储在磁盘文件中,则可以使用FilePathResult对象。如果您的内容可通过流使用,则使用FileStreamResult,如果您将其作为字节数组提供,则选择FileContentResult。所有这些对象都派生自FileResult,并且只有在将数据写入响应流的方式上才会彼此不同。

ex:for PDF

public FileResult Export()
{
var output = new MemoryStream();
    :
    return File(output.ToArray(), "application/pdf", "MyFile.pdf");
}

请找到以下链接,了解如何使用Ajax Jquery调用action方法

http://blog.bobcravens.com/2009/11/ajax-calls-to-asp-net-mvc-action-methods-using-jquery/

你可以参考这篇文章,它们可以让你对FileResult

有所了解

http://www.dotnetcurry.com/ShowArticle.aspx?ID=807