使用 ashx 处理程序从 SQL 表中读取 BLOB 文件时如何在 Edge 中查看文件

Posted

技术标签:

【中文标题】使用 ashx 处理程序从 SQL 表中读取 BLOB 文件时如何在 Edge 中查看文件【英文标题】:How do I view file in Edge when using ashx handler to read BLOB file from SQL table 【发布时间】:2021-12-23 11:53:36 【问题描述】:

我的 javascript 代码列出了 SQL 表中的文件名,该表还包括文件内容的 BLOB。如何在 Edge 中显示文件?我知道对于图像,我可以执行以下操作:

$('#imgRequestImage').attr("src", "GetImageHandler.ashx?documentid=" + myDocumentID); 其中图像是 html 页面的一部分。

如何在单独的窗口中查看图像? 如何在单独的窗口中查看 PDF?

这是我的 ashx 代码:

Imports System.Web
Imports System.Web.Services
Imports System.Data.SqlClient

Public Class GetImageHandler
    Implements System.Web.IHttpHandler

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

        Dim documentid As String = context.Request.QueryString("documentid").ToString
        Using con As New SqlConnection(GetConnectionString("MyConnectionString"))
            Using cmd As New SqlCommand()
                cmd.CommandType = CommandType.StoredProcedure
                cmd.CommandText = "spDocumentByDocIDSelect"
                cmd.Parameters.AddWithValue("@pDocumentID", documentid)
                cmd.Connection = con
                con.Open()
                Dim sdr As SqlDataReader = cmd.ExecuteReader()
                If sdr.HasRows Then
                    While sdr.Read()
                        If Not String.IsNullOrEmpty(sdr(1).ToString) Then
                            Dim imageBytes As Byte() = DirectCast(sdr(2), Byte())
                            context.Response.ContentType = "image/*, application/pdf, text/*"
                            context.Response.BinaryWrite(imageBytes)
                        End If
                    End While
                Else
                    context.Response.StatusCode = 404
                End If
                con.Close()
            End Using
        End Using

    End Sub

    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property
    Public Shared Function GetConnectionString(ByVal conName As String) As String
        Dim strReturn As New String("")
        strReturn = ConfigurationManager.ConnectionStrings(conName).ConnectionString
        'return the connection string to the calling method  
        Return strReturn
    End Function

End Class

这是我在 JavaScript 代码中尝试调用处理程序并在单独的窗口中显示的内容:

window.open("GetImageHandler.ashx?documentid=" + myDocumentID, "_blank");

当窗口打开时,它显示的是一堆字符,而不是图像或 pdf。

如何让 BLOB 在 Edge 中显示为图像或 PDF?

【问题讨论】:

请问您是否有机会检查我的答案?如果您有任何其他问题,我很乐意为您提供帮助。 【参考方案1】:

我认为这个问题是由这一行引起的:

context.Response.ContentType = "image/*, application/pdf, text/*"

Content-Type = "Content-Type" ":" 媒体类型,它需要一个单一媒体类型,不能接受多个。并且使用window.open()时不能设置header,但是可以创建一个空页面,填写内容。

我用一个简单的base64字符串进行了测试,效果很好:

Public Sub ProcessRequest(ByVal context As HttpContext)
    Dim base64string As String = "JVBERi0xLjcNJeLjz9MNCjEgMCBvYmoNPDwvRmls..."
    Dim blob As Byte() = Convert.FromBase64String(base64string)
    context.Response.ContentType = "application/pdf"
    context.Response.BinaryWrite(blob)
End Sub

<body>
<form id="form1" runat="server">
    <div>
        <input type="button" name="show" value="Open in new tab" onclick="myfunction()" />
    </div>
</form>
<script>
    function myfunction() 
        window.open("GetImageHandler.ashx?documentid=1", "_blank")
    
</script>
</body>

如果您需要使用window.open() 在新窗口中显示图像,您可能需要执行以下操作:

context.Response.ContentType = "image/*"

<input type="button" name="show" value="Open in new tab" onclick="myfunction()" />
<script>
    function myfunction() 
        const image_window = window.open("", "_blank")
        image_window.document.write(`
          <html>
            <head>
            </head>
            <body>
                <img src="GetImageHandler.ashx?documentid=1" />
            </body>
          </html>
        `);
    
</script>

【讨论】:

以上是关于使用 ashx 处理程序从 SQL 表中读取 BLOB 文件时如何在 Edge 中查看文件的主要内容,如果未能解决你的问题,请参考以下文章

ASHX 处理程序无法与我的网络外的客户端正常工作

ashx比较完美的权限处理(适合页面,不适合安卓远程读取接口)

使用 SQL 从数据库视图而不是表中读取

从 SQL Server 插入一些数据的表中读取数据的问题

如何在 .ashx 处理程序上使用输出缓存

如何在 ASP.NET MVC 中使用通用处理程序 (ASHX)?