【问题标题】:How to force download of file from ASP.NET WebAPI如何强制从 ASP.NET WebAPI 下载文件
【发布时间】:2012-11-20 17:25:11
【问题描述】:

这是我的 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);
    }

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

【问题讨论】:

  • 您的意思是要在下载文件之前显示打开、另存为弹出窗口吗?
  • 是的..我想用jquery ajax方法,怎么做?
  • 但在HttpResponseMessage返回后
  • 您可以使用window.location 导航到此下载网址,也可以使用javascript 中的window.open() 打开一个新窗口。您实际上无法使用 ajax 下载文件。
  • 我正面临着确切的问题。你找到解决方案了吗?

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


【解决方案1】:

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

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

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

我已经使用返回 FileContentResult 的操作对此进行了测试,但是如果您像您一样在响应标头中设置 ContentDisposition,我看不出它为什么会这样做'不能使用 WebAPI 方法。

【讨论】:

    【解决方案2】:

    可用于文件的 ActionResult 类型之一是 FileResult 如果要传输的内容存储在磁盘文件中,则可以使用 FilePathResult 对象。如果您的内容可通过流获得,则使用 FileStreamResult,如果您将其作为字节数组提供,则选择 FileContentResult。所有这些对象都派生自 FileResult,它们之间的区别仅在于它们将数据写入响应流的方式。

    例如:用于 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

    【讨论】:

    • 我不想使用 mvc 动作,我只想在客户端直接调用 web-api 方法,例如:$.ajax( { url: 'localhost/WebAPITest/api/MyAPI' ,输入: "post" , contentType: "application/json" , data: '' , 成功: function (retData) { ***** }
    • 我只是不知道如何处理来自 ajax 成功函数的 retdata 参数以弹出我的下载
    猜你喜欢
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2017-05-13
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多