4

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

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

4

2 回答 2

3

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

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

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

我已经使用返回FileContentResult的操作对此进行了测试,但是如果您在响应标头中设置ContentDisposition,就像您所做的那样,我看不出它不能与 WebAPI 方法一起使用的原因。

于 2012-12-03T15:55:08.987 回答
0

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

例如:对于 PDF

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

请找到下面的链接以了解如何使用 Ajax Jquery 调用操作方法

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

于 2012-12-03T09:24:33.747 回答