如何获得asp.net mvc操作以始终如一地将文件传送到浏览器?

时间:2011-08-15 19:05:27

标签: asp.net asp.net-mvc

我正在构建一个小动作来获取加密的PDF文件路径,解密它,并将生成的PDF传送到浏览器。

我的代码在Chrome和Firefox中100%有效,但在IE9中只有50%的时间可用。

当我按照IE9中的链接进行操作时,看起来它在浏览器窗口中打开了Adobe Reader插件,但在我点击刷新之前没有显示任何文件。

这是我的代码:

    [CheckSubscriber]
    public ActionResult file(string path)
    {
        string mappedPath = Server.MapPath(
                                EncryptDecrypt.Decrypt(path,
                                EncString));

        return base.File(mappedPath, "application/pdf");

    }

如何在IE9中始终如一地使用它?

我只是在这里大声思考,但也许我使用了错误的mime-type?

3 个答案:

答案 0 :(得分:4)

您应该明确设置

Content-Disposition: inline; filename="foo.pdf"

content-disposition 是从服务器返回响应时的​​关键响应标头。如果与MIME类型一起指定,所有浏览器将100%正确地检测文件。

您可以使用Fiddler确保响应标头按顺序排列。

修改

您无法使用“ActionResult”返回类型执行此操作。

您需要使用“FilePathResult”或“FileStreamResult”,这两者都可以在System.Web.MVC名称空间中找到。

或者,您可以创建Custom Action Return Type并将其用于此操作。 我提供的文章一步一步地提供了关于如何执行此操作的代码。

答案 1 :(得分:0)

我会使用Fiddler来查看浏览器发送/接收的请求/响应之间的区别,看看是否可以从那里发现它。

答案 2 :(得分:0)

以下是我如何返回Excel文件(pdf应该相同):

    public FileResult DownloadErrors(string filename)
    {
        var file = System.IO.File.ReadAllText(filename);

        return File(new System.Text.UTF8Encoding().GetBytes(file), "application/ms-excel", "Errors.csv");
    }

请务必使用FileResult而不是ActionResult。