在asp.net webform中使用“另存为”选项打开PDF文件

时间:2016-05-18 03:37:09

标签: c# asp.net pdf webforms

我在网站上有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>

2 个答案:

答案 0 :(得分:2)

如果您要点击的是文件下载链接,则会弹出save asopen对话框,这与用户的浏览器配置有关。在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);
}