struts中的action如下:
public ActionForward ShowImage(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
FrontTerminalForm ftf = (FrontTerminalForm) form;
String imageID = request.getParameter("imageID");
if(imageID != null && imageID.length() > 0){
ftf.setImgID(imageID);
}
StringBuffer sb = new StringBuffer();
sb.append(" select IMAGETYPE,IMAGE from IMAGETEST where ID=?");
DB db = new DB();
try {
db.openDB();
db.preparedStatement(sb.toString());
db.setInt(1, Integer.valueOf(ftf.getImgID()));
db.executeQuery();
if(db.next()) {
ftf.setImageType(db.getString(1));
InputStream in = db.getBinaryStream(2);
int bytesRead = 0;
byte[] buffer = new byte[8192];
response.setContentType("image/jpeg");
                        response.setContentLength(in.available());
            
                        int size = 0;
                            OutputStream outs = response.getOutputStream();
                        while ((bytesRead = in.read(buffer, 0, 8192)) != -1) {
                         size += bytesRead;
                            outs.write(buffer, 0, bytesRead);
                        }
                        response.setContentLength(size);
            
                        in.close();
                outs.flush();
                outs.close();
                } 
}catch(Exception e){
        e.printStackTrace();
}finally{
db.closeDB();
db = null;
}
return null; 
}
jsp页面代码如下:
<%@ page contentType="text/html; charset=gb2312" language="java"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ page import="java.util.*,hsp.ppr.model.*"%><html>
<head>
<layout:skin includeScript="true" />
<title>查看上传图片</title>
<link href="/css/css1.css" rel="stylesheet" type="text/css" />
<link href="/css/css.css" rel="stylesheet" type="text/css" />
</head><body>
<html:form action="/frontTerminal.do" method="post" enctype="multipart/form-data">
<input name="imgPathTemp" type="hidden" value="<bean:write name='frontTerminalForm' property='imgPathTemp'/>"/>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<td height="26" valign="middle" background="images/sys-line1.jpg">
<img src="images/wheel.gif" width="17" height="17"
align="absmiddle" />
<span class="TitleText">图片显示</span>
</td>
</TR>
<TR>
<TD width="23%" height="24px" align="left">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="8" background="images/sys-line.jpg">
<img src="images/sys-line.jpg" width="8" height="35" />
</td>
<td background="images/sys-line.jpg">
<a href="#" onclick="javascript:window.history.go(-1);">
<img src="images/button/btn-back.jpg" width="54" height="25" align="absmiddle"/>
</a>
</td>
</tr>
</table>
</TD>
</TR>
<TR>
<TD>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="frontTerminal.do?PCommand=ShowImage&imgID=<bean:write name='frontTerminalForm' property='imgID'/>"/>
</td>
</tr>
</table>
</TD>
</TR>
</TBODY>
</TABLE>
</html:form>
</body>
</html>问题:
我将图片从客户端能顺利存储在oracle数据库中,表定义如下:
CREATE TABLE LPMIS2007_1.IMAGETEST
(
    ID                             NUMBER(3,0),
    IMAGETYPE                      VARCHAR2(30),
    IMAGE                          BLOB
)
/
并且从库中将IMAGE取出,存文件图片都是正常的,并且把该取出的文件显示在jsp中也是正常。下面的代码是从文件获取二进制流:
String imgPathTemp = request.getParameter("imgPathTemp");
InputStream fin = new FileInputStream(new File(imgPathTemp));
int bytesRead1 = 0;
byte[] buffer1 = new byte[8192];
response.setContentType("image/jpeg");
 response.setContentLength(fin.available());
int size1 = 0;
        OutputStream outs1 = response.getOutputStream();
        while ((bytesRead1 = fin.read(buffer1, 0, 8192)) != -1) {
           size1 += bytesRead1;
              outs1.write(buffer1, 0, bytesRead1);
        }
        response.setContentLength(size1);
        outs1.flush();
        fin.close();
outs1.close();
   通过获取文件的二进制流赋值给response也能在页面上正常显示,但直接将IMAGE从库中取得将二进制流赋值给response,显示在页面上,就会出错,页面上出现小红叉。我将上传文件的2进制流和数据库BLOB二进制流进行了比较,是一致的。
   我就纳闷了,一样的二进制流赋给response,为什么一个能显示,另一个就不能。

解决方案 »

  1.   

    我将上传文件的2进制流和数据库BLOB二进制流进行了比较,是一致的。请问你怎么比较的???凭直觉它们肯定存在细微区别的,或者多了些什么东西,或者少了些什么东西
      

  2.   

    InputStream in = db.getBinaryStream(2); 
    gai yi xia  shishi.oracle.sql.BlOB blob=(oracle.sql.BLOB) db.getBlog(2);
    InputStream in=blob.getBinaryStream();
      

  3.   

    还是不行啊。。郁闷了。真是有点奇怪啊 我将数据库中的二进制流写给response的同时直接保存成文件也是好的。
      

  4.   

    oracle.sql.BLOB blob = (oracle.sql.BLOB)db.getBlob(2);
    BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream());
    BufferedInputStream bos = new BufferedOutputStream(response.getOutputStream());
    int n = 0;
    while((n=bis.read()) != -1) {
    if(noBolb) {
    noBolb = false;
    }
    bos.write(n);
    }shi shi zhe ge. 
      

  5.   

    不对啊我把你写的改了一下oracle.sql.BLOB blob=(oracle.sql.BLOB) db.getBlob(2); 
    BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream());
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); 

    InputStream in = blob.getBinaryStream();
    int size = 0;
    int bytesRead = 0;
    byte[] buffer = new byte[8192];
    response.setContentType("image/jpeg");
    response.setContentLength(in.available());
    while((bytesRead = bis.read(buffer, 0, 8192)) != -1){
    size += bytesRead;
    bos.write(buffer, 0, bytesRead);
    }
    bos.flush();
                bos.close();
                bis.close();
      

  6.   

    qinglongren 用你给的代码也是一样的 我又试了以下
      

  7.   

    shi bu shi lu ji you dian wenti .wo de ke yi cheng  gong de 
      

  8.   

    mei shu chu qu .in out dou zai finally li guan shishi
      

  9.   

    int bytesRead = 0; 
    byte[] buffer = new byte[8192]; 
    response.setContentType("image/jpeg"); 
                            response.setContentLength(in.available()); 
                 
                            int size = 0; 
                                OutputStream outs = response.getOutputStream(); 
                            while ((bytesRead = in.read(buffer, 0, 8192)) != -1) { 
                             size += bytesRead; 
                                outs.write(buffer, 0, bytesRead); 
                            } 
                            response.setContentLength(size); 
                 
                            in.close(); 
                    outs.flush(); 
                    outs.close(); 
                    }  
    ti huan cheng 
    oracle.sql.BLOB blob = (oracle.sql.BLOB)db.getBlob(2); 
    BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream()); 
    BufferedInputStream bos = new BufferedOutputStream(response.getOutputStream()); 
    int n = 0; 
    while((n=bis.read()) != -1) { 
    if(noBolb) { 
    noBolb = false; 

    bos.write(n); 

    wo shu ru fa huai le 
      

  10.   

    out.flush();已经保证一定会把缓存区的内容一并输出的
      

  11.   

    if(noBolb)中的noBolb是什么东东啊?
      

  12.   

    FLUSH zai outputstream zhong shi mei yong de .
      

  13.   

    oracle.sql.BLOB blob=(oracle.sql.BLOB) db.getBlob(2); 
    BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream());
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); 

    InputStream in = blob.getBinaryStream();
    int size = 0;
    int b = 0;
    byte[] buffer = new byte[8192];
    response.setContentType("image/jpeg");
                response.setContentLength(in.available());             while((b=bis.read()) != -1) { 
             bos.write(b); 
             }
                bos.flush();
                bos.close();
                bis.close();我用你的代码如上面写的尝试了。。不成啊!
      

  14.   

    flush没用的。不会吧郁闷了。有这样的事情我试一试
      

  15.   

    BufferedInputStream bos = new BufferedOutputStream(response.getOutputStream());  你这句写错了吧!??
      

  16.   

    我刚运行的代码还是不行啊!!!StringBuffer sb = new StringBuffer();
    sb.append(" select IMAGETYPE,IMAGE from IMAGETEST where ID=?");
    DB db = new DB();
    try {
    db.openDB();
    db.preparedStatement(sb.toString());
    db.setInt(1, Integer.valueOf(ftf.getImgID()));
    db.executeQuery();
    if(db.next()) {
    ftf.setImageType(db.getString(1));
    oracle.sql.BLOB blob=(oracle.sql.BLOB) db.getBlob(2); 
    BufferedInputStream bis = new BufferedInputStream(blob.getBinaryStream());
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream()); 

    InputStream in = blob.getBinaryStream();
    int size = 0;
    int b = 0;
    byte[] buffer = new byte[8192];
    response.setContentType("image/jpeg");
            response.setContentLength(in.available());        while((b=bis.read()) != -1) { 
         bos.write(b); 
         }
            //bos.flush();
            bos.close();
            bis.close();
           } 
    }catch(Exception e){
    e.printStackTrace();
    //LogUtil.logOperation(appUser, StaticValues.LOG_SELECT_ERR, "IMAGETEST", "Select Error:");
    }finally{
    db.closeDB();
    db = null;
    }
    return null; 
      

  17.   

    mei yong de dai ma xian shan le . liu de guan bi fang zai finally li mian.shishi.
      

  18.   

    可能和缓存有关
    楼主,你从数据库获取的流,实际上在你outs.write(buffer, 0, bytesRead); 的时候,并没有完全读入内存。
    而是在数据库中,也就是,可能在另外一台机上。
      

  19.   

    所以,建议楼主将读出部分,以及输出部分分离。先用一个byte[] buf,从数据库获取所有数据。在完全获得数据后,关闭数据库的输入流。然后再执行,buf到ServletOutputStream的操作。
      

  20.   

     luckyjame 有这样的事情我在bytesRead树组中都看见内容了
      

  21.   

    仔细研究原因的话,问题就在response.setContentLength(***);大约就是这几个语句有问题。
      

  22.   


    实在不行,你还可以多做一个操作,现将buf流BufferedImage化,然后做输出操作。
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ImageIO.write(image, "JPEG", bos);
            byte[] buf = bos.toByteArray();其实你的问题很明显,你在response输出前,并没能确保你的图片数据完全可靠。
      

  23.   

    好了谢谢。。真的是这个问题啊太感谢luckyjame 和 qinglongren 的帮助了
      

  24.   

    开发;卓越呼叫中心、三农热线”语音农业综合信息服务平台、卓越办公自动化软件、卓越电厂MIS系统、卓越客户关系管理系统、卓越网站制作、卓越医疗信息管理系统;沈阳卓越科技有限公司;www.excellence-tech.com