使用 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 中查看文件的主要内容,如果未能解决你的问题,请参考以下文章