如何让浏览器以二进制形式显示写入客户端的图像?

时间:2018-01-16 02:28:32

标签: asp.net vb.net

在ASP文件中,我以二进制形式读取并输出图像。

我希望浏览器显示图像,而不是下载。

我知道标题Content-Disposition应为inline

但是我无法确定应该使用什么Content-Type,因为我无法确定图像的格式。

我知道image/png适用于chrome中的png和jpg,但我不确定image/png是否适合所有格式的图像。

'lngFileLength is the size of image
Response.AddHeader "Content-Length", lngFileLength
Response.ContentType = "image/png"
Response.AddHeader "Content-Disposition", "inline"
'rst1(strImageField).Value is the image in binary form
Response.BinaryWrite rst1(strImageField).Value

感谢您的帮助。

编辑:我不认为我的问题与PHP : binary image data, checking the image type重复,因为我的问题是“在浏览器中显示图像”,而不是“检查图像类型”。

我希望的最佳解决方案是我们可以通过设置标题或其他方式告诉浏览器显示,而不是下载,图像。

虽然“检查图像类型”可以解决这个问题,但它是答案,而不是问题。

1 个答案:

答案 0 :(得分:1)

您需要根据图像的实际类型设置Content-Type。您不能将其设置为任意类型并期望它可靠地工作。

要从存储在数据库中的二进制值中查找图像的实际类型,可以将值加载到System.Drawing.Image对象中,然后检查ImageFormat。您可以使用此功能:

Function GetImageMimeType(ByVal image As System.Drawing.Image)
    Select Case image.RawFormat
        Case System.Drawing.Imaging.ImageFormat.Jpeg
            Return "image/jpg"
        Case System.Drawing.Imaging.ImageFormat.Gif
            Return "image/gif"
        Case System.Drawing.Imaging.ImageFormat.Png
            Return "image/png"
    End Select
End Function

如果您愿意,可以添加其他案例。

您也可以直接从图片中获取MIME类型,如下所示:

Function GetImageMimeType(ByVal image As System.Drawing.Image)
   'System.Drawing.Imaging.ImageCodecInfo'
   For Each codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders()
       If codec.FormatID = image.RawFormat.Guid Then
           Return codec.MimeType
       End If
   Next
   Return "image/unknown"
End Function

但这有点不太可靠,它不适用于动态创建的图像,但适用于从某些源(文件,流,字节数组等)加载的所有图像。

如果您不想将二进制文件加载到System.Drawing.Image对象中,可以从前几个字节中找到图像的类型。以下是常见类型标识符列表:

Dim bmp = Encoding.ASCII.GetBytes("BM")
Dim gif = Encoding.ASCII.GetBytes("GIF")
Dim png = New Byte() {137, 80, 78, 71}
Dim tiff = New Byte() {73, 73, 42}
Dim tiff2 = New Byte() {77, 77, 42}
Dim jpeg = New Byte() {255, 216, 255, 224}
Dim jpeg2 = New Byte() {255, 216, 255, 225}