0

我们有一个模块可以生成和存储 PDF 格式的报告。

获取文档的 url 例如如下:

https://domain.com/Document/GetDocument?documentId=00000000-0000-0000-0000-000000000000

此 url 将返回一个名为: 的文档Document_UserName_Date

但是,由于有浏览器可以像 Chrome 一样查看 PDF 文件,因此该文档将在具有上述 url 的浏览器选项卡中查看。

因此,当用户尝试将该文档保存在他们的计算机中时,默认文件名(从 url 获取)是:https___domain.com.pdf而不是Document_UserName_Date.pdf我们预期的。所以我在想,如果我可以将网址更改为:

https://domain.com/Document/Document_UserName_Date.pdf

我的问题将得到解决。

4

1 回答 1

2

为了避免文档在浏览器中显示,但用户直接提示下载它,您可以使用将Content-Disposition标题设置为attachment

Content-Disposition: attachment; filename="Document_UserName_Date.pdf"

这可以通过简单地将文件名作为第三个参数传递给 File 重载来完成:

public ActionResult GetDocument(Guid documentId)
{
    byte[] document = GetDocument(documentId);
    return File(document, "application/pdf", "Document_UserName_Date.pdf");
}

更新:

如果您希望用户在其浏览器中查看内联文档,那么您可以使用路由并定义以下路由:

routes.MapRoute(
    "ViewPdfRoute",
    "document/{id}/{name}.pdf",
    new { controller = "Home", action = "GetDocument" }
);

并在您的控制器操作中:

public ActionResult GetDocument(Guid id, string name)
{
    byte[] pdf = GetDocument(id);
    return File(pdf, "application/pdf");
}

最后,您可以请求这样的文件:

http://domain.com/document/0DF7E254-0576-4BC0-8B05-34FC0F5246A2/document_username_date.pdf
于 2013-03-03T08:28:33.957 回答