我在网站上有PDF文件列表(asp.net webforms)。我想用“另存为”选项打开它们而不是直接下载。
我尝试将download
属性添加到无法正常工作的链接中。只有周围似乎是*.pdf
请求的HTTPHandler。
我看到了基于MVC的示例here
的一段代码return new FileStreamResult(stream, "application/pdf")
{
FileDownloadName = "file.pdf"
};
如何在as.net webform中将其转换为HTTPHandler,以便使用“另存为”选项打开pdf文件。
我想以某种方式这样做,以便当用户点击任何pdf文件时,Handler应该开始行动。
OR
我可以创建另一个文件handlePDF.aspx并在那里编写代码,并将pdf文件的链接更改为以下
<a href="handlePDF.aspx?file=file1.pdf">File One </a>
答案 0 :(得分:2)
如果您要点击的是文件下载链接,则会弹出save as
或open
对话框,这与用户的浏览器配置有关。在PDF的情况下,我相信Firefox有open in tab
作为默认选项。如果您尝试将文件作为文件流推送,则很可能只是将其加载到新选项卡中。
tl; dr:客户端问题
答案 1 :(得分:1)
你走在正确的轨道上。提供PDF文件通常由HttpHandler
处理。也就是说,除非它们可以通过StaticHandler
...
浏览器提升&#34;打开或保存&#34;所需的关键所需。 dialog是响应中的Content-Disposition
标头。
这是一个(未经测试的)实现,可以帮助您走上正确的轨道:
public void ProcessRequest(HttpContext context)
{
string fileName = context.Request.QueryString["file"];
if(fileName == null || fileName == "")
{
throw new ArgumentException("The file argument cannot be null or empty");
}
// fetch file here from db/filesystem/other storage
byte[] fileBytes = LoadFileBytes(fileName);
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
context.Response.ContentType = "application/pdf";
context.Response.BinaryWrite(fileBytes);
}
如果你想避免在内存中缓冲整个文件,这也可能有用(对于流上的CopyTo
方法需要.Net 4.0):
public void ProcessRequest(HttpContext context)
{
string fileName = context.Request.QueryString["file"];
if(fileName == null || fileName == "")
{
throw new ArgumentException("The file argument cannot be null or empty");
}
// fetch file stream from db/filesystem/other storage
Stream fileStream = GetFileStream(fileName);
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
context.Response.ContentType = "application/pdf";
fileStream.CopyTo(context.Response.OutputStream);
}