#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;