使用Ajax从数据库中检索图像

时间:2010-05-16 08:12:20

标签: java javascript ajax jsp servlets

我正在尝试使用Ajax从数据库中读取图像,但我无法读取img src的xmlhttp.responseText。图像在数据库中保存为二进制数据,也作为二进制数据检索。我在JSP中使用Ajax,因为我想让用户能够上传图像,我将查看上次上传的图像,鼠标移动操作Ajax将被激活并恢复图像,问题在于阅读img来自回应。

这是Ajax函数:

function ajaxFunction(path) {
    if (xmlhttp) { 
        var s = path;
        xmlhttp.open("GET", s, true); 
        xmlhttp.onreadystatechange = handleServerResponse;
        xmlhttp.send(null);
    }
}

function handleServerResponse() {
    if (xmlhttp.readyState == 4) {
        var Image = document.getElementById(Image_Element_Name);
        document.getElementById(Image_Element_Name).src = "data:" + xmlhttp.responseText;
    }
}

我在服务器中也遇到异常:

10415315 [TP-Processor1] WARN core.MsgContext  - Error sending end packet
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:537)
    at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:127)
    at org.apache.jk.core.MsgContext.action(MsgContext.java:302)
    at org.apache.coyote.Response.action(Response.java:183)
    at org.apache.coyote.Response.finish(Response.java:305)
    at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:281)
    at org.apache.catalina.connector.Response.finishResponse(Response.java:478)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:154)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
    at java.lang.Thread.run(Thread.java:619)
10415316 [TP-Processor1] WARN common.ChannelSocket  - processCallbacks status 2

2 个答案:

答案 0 :(得分:2)

为什么要将图像存储在数据库中? 将它们保存为文件并将URL保存在数据库中。

通过这种方式,您可以使用AJAX调用将读取数据库的PHP,拉出图像的URL并将其返回给您,这样您就可以执行以下操作:

img = document.getElementById("myimage");
img.src = URL; // where URL will contain the URL you got from the AJAX call 

答案 1 :(得分:0)

这不是它的工作方式。如前所述,您基本上只需要将src元素的<img>属性更改为其他URL。然后,webbrowser将自动重新加载图像。

对于JSP / Servlet,URL应该只指向Servlet类,该类从数据库中获取InputStream图像并将其写入响应的OutputStream通常的Java IO方式以及一组响应头。

以下是您的Javascript应如何显示:

function changeImage(newSrc) {
    document.getElementById(Image_Element_Name).src = newSrc;
}

this answer中,您可以找到Servlet应如何显示的完整示例。


SocketException: broken pipe只是客户端根本没有处理响应并中止它的标志。如果你摆脱了Ajax的东西,并按照上面的解释去做,那么它应该完美无缺。