通过Webforms ASP.net链接到存储在网络上的PDF?

时间:2014-09-03 19:54:06

标签: asp.net vb.net

我正在创建一个存储在我们网络驱动器上的pdf的超链接。问题是我通过ASP.net创建超链接,但点击链接绝对没有。如果您检查元素并单击链接,它就可以正常工作。它似乎与这个问题有关(HTML links to local network shares)。通过下载该主题中引用的Chrome扩展程序,我可以打开本地链接。在Internet Explorer中,我可以单击链接而不会出现任何问题或扩展名。

我通过配置值“System.Net.WebUtility.HtmlEncode(configValue)”填充NavigateNurl

这是我正在使用的路径(名称略有改动): 文件://unk-file01/forms%20engine/Templates/Fake/ES_User_Manual_GBA_FINAL_081514.pdf

<div id="manualMenu" runat="server">
                    <div id="manual">
                        <asp:HyperLink ID="ESUserManualLink" Target="_blank" runat="server"  Text="GBA User Manual" >
                GBA User Manual
                        </asp:HyperLink>

                        <asp:HyperLink ID="UnderwritingManualLink" Target="_blank" runat="server" 
                            Text="GBA Underwriting Guide">
                GBA Underwriting Guide
                        </asp:HyperLink>

                    </div>
                </div>

除了在其他地方托管文件之外,除了托管文件之外,我还能做些什么来使这项工作跨所有平台?

1 个答案:

答案 0 :(得分:2)

如果您可以使您的网址看起来像http://example.com/DownloadPdf.ashx?file=ES_User_Manual_GBA_FINAL_081514,那么DownloadPdf.ashx的合适代码可能看起来像

Imports System.IO
Imports System.Web
Imports System.Web.Services

Public Class DownloadPdf
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

        Dim fname = context.Request.QueryString("file")
        Dim actualFile = Path.Combine("//unk-file01/forms engine/Templates/Fake", fname) & ".pdf"

        If File.Exists(actualFile) Then
            context.Response.ContentType = "application/pdf"
            context.Response.AddHeader("Content-Disposition", "attachment; filename=""" & Path.GetFileName(actualFile) & """")
            context.Response.TransmitFile(actualFile)
        Else
            context.Response.Clear()
            context.Response.TrySkipIisCustomErrors = True
            context.Response.StatusCode = 404
            context.Response.Write("<html><head><title>404 - File not found</title><style>body {font-family: sans-serif;}</style></head><body><h1>404 - File not found</h1><p>Sorry, that file is not available .</p></body></html>")
            context.Response.End()

        End If

    End Sub

    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

End Class

请注意,它会强制文件扩展名为.pdf - 您可以添加其他安全性,例如阻止目录遍历并检查用户是否可以访问该文件。

代码未按原样进行测试,但其派生的代码适用于生产环境(确实具有更高的安全性)。