我们有一个模块来生成和存储PDF格式的报告。
获取文档的网址,例如:
https://domain.com/Document/GetDocument?documentId=00000000-0000-0000-0000-000000000000
此网址将返回名称为Document_UserName_Date
的文档。
但是,由于浏览器可以像Chrome一样查看PDF文件,因此可以在带有上述网址的浏览器标签中查看该文档。
因此,当用户尝试将该文档保存在他们的计算机中时,默认文件名(从url获取)为:https___domain.com.pdf
而不是Document_UserName_Date.pdf
,正如我们预期的那样。
所以我在想,如果我可以将网址更改为:
https://domain.com/Document/Document_UserName_Date.pdf
我的问题将得到解决。
答案 0 :(得分:2)
为了避免文档显示在浏览器中,但用户直接提示下载它,您可以使用Content-Disposition
标题设置为attachment
:
Content-Disposition: attachment; filename="Document_UserName_Date.pdf"
这可以通过简单地将文件名作为第三个参数传递给File overload:
来完成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