【问题标题】:Browse to a PDF in ASP.NET Web Site Folder浏览到 ASP.NET 网站文件夹中的 PDF
【发布时间】:2021-08-15 23:25:05
【问题描述】:

我有一个在服务器上的 IIS 下运行的 ASP.NET Core 网站。我创建了一个文件夹,并希望使用该站点的 url 在浏览器中显示该文件夹中的任何 pdf 文件。

https://example.com/pdf/myfile.pdf

文件夹结构: c:\inetpub\wwwroot\mysite\pdf\myfile.pdf - 包含 pdf 文件

我在 IIS 管理器中为该站点启用了目录浏览,但出现 404 错误。 我使用的是 Window Server 2019 IIS 版本 10。

【问题讨论】:

  • 您的网络服务器是否配置为提供 .pdf 文件?是否正在进行任何请求过滤?
  • 您的意思是配置 IIS 以提供 .pdf 文件吗?这是怎么做的?我不知道有任何过滤。我在哪里检查?

标签: asp.net pdf iis


【解决方案1】:

我会省去文件夹/目录浏览。您无法控制用户体验和 UI。

我们只需几行代码就可以在网页中显示文件,然后有一个按钮可以在浏览器中显示 pdf。

所以我们的标记是这样的:

       <h2>Select a PDF file to view</h2>
        <br />

        <div style="width:45%">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" CssClass="table table-hover">
            <Columns>
                <asp:BoundField DataField="Date" HeaderText="Date" ItemStyle-Width="100px" />
                <asp:BoundField DataField="File Name" HeaderText="ID" />
                <asp:BoundField DataField="File Size" HeaderText="Size" ItemStyle-Width="100px" />

                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="cmdDownLoad" runat="server" Text="View" 
                            OnClick="cmdDownLoad_Click" 
                            Row = '<%# Container.DataItemIndex %>'/>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        </div>

我们从文件夹中提取文件并推入上述网格视图的代码如下所示:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If IsPostBack = False Then

        ShowFiles()

    End If

End Sub

Sub ShowFiles()
    Dim MyTable As New DataTable

    MyTable.Columns.Add("Date", GetType(String))
    MyTable.Columns.Add("File Size", GetType(String))
    MyTable.Columns.Add("File Name", GetType(String))
    MyTable.Columns.Add("FullFile", GetType(String))

    'Dim strFolder = Server.MapPath("/app_data")
    Dim strFolder = "c:\Test4"
    Dim MyDir As New DirectoryInfo(strFolder)

    Dim MyFiles() As FileInfo = MyDir.GetFiles("*.pdf")

    For Each MyFile As FileInfo In MyFiles
        Dim oneRow As DataRow = MyTable.Rows.Add

        oneRow("Date") = MyFile.LastAccessTime.ToShortDateString
        oneRow("File Size") = Int(MyFile.Length / 1024) & " KB"
        oneRow("File Name") = MyFile.Name
        oneRow("FullFile") = MyFile.FullName

    Next

    ViewState("MyTable") = MyTable

    GridView1.DataSource = MyTable
    GridView1.DataBind()

End Sub

结果是这样的:

所以,现在我们只需要在浏览器中显示 pdf 的按钮代码。

这将起作用:

Protected Sub cmdDownLoad_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender

    Dim RowID = btn.Attributes.Item("Row")
    Dim MyTable As DataTable = ViewState("MyTable")

    With MyTable.Rows(RowID)
        ShowPdf(.Item("File Name"), .Item("FullFile"))
    End With

End Sub

Sub ShowPdf(strFileOnlyName As String, strFile As String)

    Dim pDFData As Byte()
    pDFData = File.ReadAllBytes(strFile)

    Response.Buffer = False     ' //transmitfile self buffers
    Response.Clear()
    Response.ClearContent()
    Response.ClearHeaders()

    Response.AddHeader("Accept-Header", pDFData.Length.ToString())
    Response.AddHeader("Content-Length", pDFData.Length.ToString())

    Response.AddHeader("Content-Disposition", "inline; filename=" & strFileOnlyName)

    Response.AddHeader("Expires", "0")
    Response.AddHeader("Cache-Control", "private")
    Response.ContentType = "application/pdf"
    Response.AddHeader("Accept-Ranges", "bytes")
    Response.BinaryWrite(pDFData)
    Response.Flush()
    Response.End()

End Sub

因此您可以单击该按钮 - 它会在浏览器中显示 PDF。如果你回击,那么你回到网格,然后你可以查看另一个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多