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,为什么一个能显示,另一个就不能。
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,为什么一个能显示,另一个就不能。
gai yi xia shishi.oracle.sql.BlOB blob=(oracle.sql.BLOB) db.getBlog(2);
InputStream in=blob.getBinaryStream();
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.
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();
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
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();我用你的代码如上面写的尝试了。。不成啊!
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;
楼主,你从数据库获取的流,实际上在你outs.write(buffer, 0, bytesRead); 的时候,并没有完全读入内存。
而是在数据库中,也就是,可能在另外一台机上。
实在不行,你还可以多做一个操作,现将buf流BufferedImage化,然后做输出操作。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] buf = bos.toByteArray();其实你的问题很明显,你在response输出前,并没能确保你的图片数据完全可靠。