【问题标题】:Image is not displayed from Oracle table using servlet使用 servlet 从 Oracle 表中不显示图像
【发布时间】:2012-07-28 07:19:50
【问题描述】:

经过长时间的尝试,我终于可以成功地将图片上传到oracle database。至少我的代码是这样说的。但是为了检查图像是否成功,我写了一个servlet。运行servlet 后,我的浏览器出现黑屏,没有别的。 servlet 代码是:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DisplayImage extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException  {
    // TODO Auto-generated method stub
     try {
         Class.forName("oracle.jdbc.driver.OracleDriver");  
         String url = "jdbc:oracle:thin:@localhost:1521:XE";
         Connection con = DriverManager.getConnection(url,"system","root");
            PreparedStatement ps = con.prepareStatement("select image from insertimage");
            ResultSet rs = ps.executeQuery();
            rs.next();
            Blob  b = rs.getBlob("image");
            response.setContentType("image/jpeg");
            response.setContentLength( (int) b.length());
            InputStream is = b.getBinaryStream();
            OutputStream os = response.getOutputStream();
            byte buf[] = new byte[(int) b.length()];
            is.read(buf);
            os.write(buf);
            os.close();
        }
        catch(Exception ex) {
             System.out.println(ex.getMessage());
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
}

  }

顺便说一句,由于我对此完全陌生,因此我从File upload and display demo 获得了广泛的帮助。 编辑:如果仅从 FF 查看,我会得到黑屏,但如果从 Eclipse 的内部网络浏览器查看,它会显示一个单词 upload。非常奇怪的行为!

【问题讨论】:

    标签: image servlets oracle10g blob data-retrieval


    【解决方案1】:

    使用调试器或跟踪代码来查看它执行了什么。

    使用 Firebug 查看响应包含的内容。

    并修复从 blob 到输出流的读取和写入:InputStream.read() 不一定一次读取所有字节。它返回实际读取的字节数。您应该循环直到此方法返回 -1 以指示已读取所有内容。阅读Java IO tutorial

    【讨论】:

    • 那么图片如何在浏览器中显示呢?还有其他程序吗!!??
    • 我也尝试过像while(is.read()!=-1) { is.read(buf); } 所说的那样循环,但它没有提供任何其他信息!
    • 输出中有错误信息吗?如果您使用throw new RuntimeException(ex) 而不是System.out.println(ex.getMessage()),会发生什么?您是否使用调试器单步执行代码?
    • 不,我在输出和控制台中都没有收到任何错误消息。我试过throws RuntimeException,也没影响。
    • 顺便说一句,我解决了这个问题。显示 servlet 工作正常。上传时出现问题。上传过程中没有插入图像。我使用 SQL 开发人员软件对其进行了复核。
    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 2011-11-08
    • 1970-01-01
    • 2013-01-11
    • 2018-10-13
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    相关资源
    最近更新 更多