Как просмотреть файл в Edge при использовании обработчика ashx для чтения файла большого двоичного объекта из таблицы SQL

#file #pdf #blob #microsoft-edge #ashx

Вопрос:

У меня есть код JavaScript, в котором перечислены имена файлов в таблице SQL, которая также включает большой двоичный объект для содержимого файла. Как отобразить файл в 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-файл.

Как заставить большой двоичный объект отображаться в виде изображения или PDF в Edge?

Комментарии:

1. Могу я узнать, есть ли у вас возможность проверить мой ответ? Я рад помочь, если у вас есть еще какие-либо вопросы.

Ответ №1:

Я думаю, что эта проблема вызвана этой строкой:

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

Тип содержимого = «Тип содержимого» «:» тип носителя, и он принимает один тип носителя и не может принимать несколько. И вы не можете установить заголовок при использовании window.open() , но вы можете создать пустую страницу и заполнить ее содержимым.

Я протестировал простую строку 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  

 lt;bodygt; lt;form id="form1" runat="server"gt;  lt;divgt;  lt;input type="button" name="show" value="Open in new tab" onclick="myfunction()" /gt;  lt;/divgt; lt;/formgt; lt;scriptgt;  function myfunction() {  window.open("GetImageHandler.ashx?documentid=1", "_blank")  } lt;/scriptgt; lt;/bodygt;  

И если вам нужно использовать window.open() для отображения изображения в новом окне, вам может потребоваться сделать что-то вроде этого:

 context.Response.ContentType = "image/*"  

 lt;input type="button" name="show" value="Open in new tab" onclick="myfunction()" /gt; lt;scriptgt;  function myfunction() {  const image_window = window.open("", "_blank")  image_window.document.write(`  lt;htmlgt;  lt;headgt;  lt;/headgt;  lt;bodygt;  lt;img src="GetImageHandler.ashx?documentid=1" /gt;  lt;/bodygt;  lt;/htmlgt;  `);  } lt;/scriptgt;