2011-12-24 65 views
0

我想通过一个httphandler显示一个二进制图像。这里是我的代码:试图通过HttpHandler显示一个二进制图像

Ajax调用

$.ajax({ 
    type: "GET", 
    url: "AnswerPostHandler.ashx", 
    data: "imgid=1380", 
    success: function (msg) { 
      $(parent).append(msg); 
    }, 
    error: function (msg){ 
      alert(msg); 
    } 
}); 

处理程序代码

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.ContentType = "image/JPEG"; 
    try 
    { 
     krystaladbDataContext db = new krystaladbDataContext(); 

     var binimg = (from i in db.image_tables 
         where i.IMG_ID.Equals(1380) 
         select i.IMG_THUMB).Single(); 


     byte[] b = binimg.ToArray(); 
     MemoryStream ms = new MemoryStream(b); 
     Image img = Image.FromStream(ms); 
     img.Save(context.Response.OutputStream, 
      System.Drawing.Imaging.ImageFormat.Jpeg); 
    } 
    catch (Exception ex) 
    { 
     context.Response.Write(ex); 
    } 
} 

东西似乎仍然不就在这里,它是倾销的二进制数据。 Base64编码也是一种选择,但是我已经测试过了,它在IE 7上不起作用(从字面上看,它就是图像的一部分)。

你能告诉我我在做什么错在这里,以及如何让它正确吗?感谢

+0

不需要构造图像。只需写入字节数组 - context.Response.BinaryWrite(b); – adatapost 2011-12-24 12:05:50

+0

我试图做到这一点,但图像不会显示... – 2011-12-24 12:26:46

+0

要不能写入ajax输出(二进制)到DOM元素。您可以使用base64 DataURI(在这种情况下,您必须修改处理程序代码),但浏览器有许多问题。最好和简单的选择是使用 - 图像标签。 adatapost 2011-12-24 13:00:02

回答

3

处理程序代码,

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.ContentType = "image/JPEG"; 
    try 
    { 
     krystaladbDataContext db = new krystaladbDataContext(); 
     var binimg = (from i in db.image_tables 
         where i.IMG_ID.Equals(1380) 
         select i.IMG_THUMB).Single(); 


     byte[] b = binimg.ToArray(); 
     context.Response.BinaryWrite(b); 
     context.Response.Flush(); 
    } 
    catch (Exception ex) 
    { 
     context.Response.Write(ex); 
    } 
} 

和HTML标记<img>

<img src="AnswerPostHandler.ashx?imgid=1380" alt="None" id="img1" /> 

或者你可以通过jQuery代码要求:

$("#showImageButton").click(function() { 
       $("#img1").attr("src", "AnswerPostHandler.ashx?imgid=1380"); 
      }); 
+0

非常感谢这个@AVD。我花了几个小时寻找这个。 – 2011-12-24 13:30:15

+0

任何想法如何以这种方式直接下载文件? – Pierre 2014-07-03 13:04:22

+0

使用'Right click + save as' – adatapost 2014-07-04 01:50:13

-1

它会更容易做这样的事情 $(父)的.html(“”)

二进制流将很难在浏览器作为IMG源来实现。

+0

谢谢,但这并不能帮助我:/ – 2011-12-24 12:34:20