搞图片上传搞了好久,开始上传大照片时(>2M),老是会出现表被死锁(传小照片不会:<1m),原来的服务器是装在LINUX下,后来换了个服务器,换成WIN 2003 SERVER,就不会出现这种情况了。具体原因嘛,还没有查出来,高手看到,留个言吧~~
具体的代码如下:
选择文件(select_file_upload.jsp:
- <%@ page language="java" import="java.util.*"
- pageEncoding="GB2312"%>
- <%@ page contentType="text/html; charset=GB2312"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <%
- String group_id=request.getParameter("group_id"); ///集团ID
- %>
- <html>
- <head>
- <title>上传文件</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <link rel="stylesheet" type="text/css" href="../css/su.css">
- </head>
- <script type="text/javascript">
- function checkpic(){
- var filess=form1.path.value;
- filess=filess.toUpperCase();
- //if(filess.indexOf(".JPG")==-1){
- //alert("您选择的文件格式错误!/r/n/r请重新选择jpg文件!");
- //return false;
- //}
- }
- function uploadpic(){
- if(form1.path.value==""){
- alert("您没有选择要上传的文件!");
- return false;
- }
- //var filess=form1.path.value;
- // filess=filess.toUpperCase();
- //if(filess.indexOf(".JPG")==-1){
- //alert("您选择的文件格式错误!/r/n/r请重新选择jpg文件!");
- //return false;
- //}
- form1.submit();
- }
- </script>
- <body>
- <!--enctype="multipart/form-data" 是 mySmartUpload 的获得数据流的标记 但是有了它 就会影响 REQUEST 获得参数 -->
- <form name="form1" method="POST"action="select_file_upload_do.jsp?group_id=<%=group_id%>" ENCTYPE="multipart/form-data">
- <table width="90%" height="20" border='1' align='center' cellpadding='2' cellspacing="1" bordercolor='#FFFFFF' bordercolorlight='#0066ff' bordercolordark="#ffffff" bgcolor='#E8F1FF'>
- <tr>
- <th align="center" colspan="100%"><font size="3"><b>请选择图片附件(集团ID:<%=group_id%>)</b></font></th>
- </tr>
- <tr>
- <td colspan="1" height="30"><div align="center" class="input3">请选择:</div></td>
- <td colspan="2"><input name="path" type="file" size="40"οnchange="checkpic()"> </td>
- </tr>
- <tr>
- <td colspan="100%" height="32" align="center">
- <input type="button" value="提交"οnclick="uploadpic()">
- <input name="reset" type="reset" value="重设">
- <input name="reset" type="button" value="返回"οnclick="history.go(-1)"></td>
- </tr>
- <tr>
- <td height="35" colspan="100">格式说明:推荐选择JPG格式的图片,太大的图片比较浪费空间</td>
- </tr>
- </table>
- </form >
- </body>
- </html>
上传文件处理页面(select_file_upload_do.jsp):
- <%@ page language="java" import="java.util.*,java.sql.*,com.grm.util.DB" pageEncoding="GB2312"%>
- <%@ page contentType="text/html; charset=gb2312" language="java"
- import="com.jspsmart.upload.SmartUpload,java.io.*"%>
- <%@ page import="oracle.jdbc.OracleResultSet"%>
- <%@ page import="oracle.sql.BLOB"%>
- <jsp:useBean id="ci" scope="page" class="com.grm.util.CreateId" />
- <html>
- <head>
- <title>导入ORACLE数据库图片</title>
- </head>
- <body>
- <%
- // String photo_id="";///合同附件ID
- String group_id=request.getParameter("group_id"); ///集团ID
- SmartUpload su = new SmartUpload();
- su.initialize(pageContext);
- su.upload();///一定要在最前面!!
- com.jspsmart.upload.File f = su.getFiles().getFile(0);
- ///String name=System.currentTimeMillis()+"."+f.getFileExt(); ///换数字文件名
- String name= f.getFileName() ; ///用上传的文件名
- //String name=new String(f.getFileName().getBytes("ISO-8859-1"),"gb2312"); //解决LINIX下中文乱码问题
- f.saveAs("/upload_file/" + name, su.SAVE_VIRTUAL); //另存为 远程目录
- //f.saveAs("/upload_file/" + name, su.SAVE_VIRTUAL); //另存为 本地目录
- java.io.File file = new java.io.File(request.getRealPath("../")+"upload_file/" + name);//获得该文件
- //System.out.println(name);
- ///fs就是要写入的图片文件
- name=file.getName();
- System.out.println(name);
- FileInputStream fs=new FileInputStream(file);
- 上传图片到服务器
- 准备插入到ORACLE
- DB db=new DB();
- db.Init();
- Connection conn=db.getConn();
- String pic_id=ci.getMaxId("grm_new_group_pic","pic_id");
- ci.setClose();
- /* 设定不自动提交 */
- boolean defaultCommit = conn.getAutoCommit();
- conn.setAutoCommit(false);
- ResultSet rs=null;
- PreparedStatement stmt=null;
- try{
- String sql1="insert into grm_new_group_pic(pic_id,pic_name,group_id,group_pic) values('"+pic_id+"','"+name+"','"+group_id+"',empty_blob())";
- System.out.println(sql1);
- stmt=conn.prepareStatement(sql1);
- stmt.executeUpdate(sql1);
- stmt.clearParameters();
- stmt = conn.prepareStatement("SELECT group_pic FROM grm_new_group_pic WHERE pic_id = ? FOR UPDATE",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);
- stmt.setString(1,pic_id);
- rs=stmt.executeQuery();
- if (!su.getFiles().getFile(0).isMissing())
- {
- try
- {
- /*
- if (rs.next())
- {
- //得到java.sql.Blob对象,然后Cast为oracle.sql.BLOB
- oracle.sql.BLOB blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(1);
- //到数据库的输出流
- OutputStream outStream = blob.getBinaryOutputStream();
- //将输入流写到输出流
- byte[] b = new byte[blob.getBufferSize()];
- int len = 0;
- while ( (len = fs.read(b)) != -1) {
- outStream.write(b, 0, len);
- }
- //依次关闭(注意顺序)
- fs.close();
- outStream.flush();
- outStream.close();
- }
- */
- if(rs.next()){
- oracle.sql.BLOB blob = ((oracle.jdbc.OracleResultSet)rs).getBLOB(1);
- OutputStream outStream = blob.getBinaryOutputStream();
- byte[] bytes = new byte[(int)file.length()];
- fs.read(bytes);
- outStream.write(bytes);
- fs.close();
- outStream.flush();
- outStream.close();
- }
- }
- catch(Exception e)
- {
- conn.rollback();
- conn.setAutoCommit(defaultCommit); //恢复默认自动提交
- rs.close();
- stmt.close();
- db.setClose();
- file.delete();
- out.println("An error occurs : " + e.toString());
- out.println("<script language=/'javascript/'>alert('上传出错啦!请重新上传~!~');history.go(-1);</script>");
- }
- }
- conn.commit();
- conn.setAutoCommit(defaultCommit); //恢复默认自动提交
- rs.close();
- stmt.close();
- db.setClose();
- file.delete();
- out.print("<script>alert('操作成功!');window.location='../new_group/group_manage_frame.jsp?group_id="+group_id+"';</script>");
- }
- catch(Exception e)
- {
- conn.rollback();
- conn.setAutoCommit(defaultCommit); //恢复默认自动提交
- rs.close();
- stmt.close();
- db.setClose();
- file.delete();
- out.println("An error occurs : " + e.toString());
- out.println("<script language=/'javascript/'>alert('上传出错啦!请重新上传~!~');history.go(-1);</script>");
- }
- %>
- </body>
- </html>
显示照片(showpic_do。jsp):
- <%
- /*
- 模块说明书:
- 本模块输入参数 :
- 本模块输出 :显示附件图片
- 本模块主要编写人 :
- 本模块特别注意事项 :无
- 最后编辑日期 :2008-07-27
- */
- %>
- <%@ page contentType="text/html;charset=gb2312" %>
- <%@ page import="java.io.*"%>
- <%@ page import="java.sql.*, javax.sql.*" %>
- <%@ page import="javax.imageio.*" %>
- <%@ page import="java.util.*"%>
- <jsp:useBean id="db" scope="page" class="com.grm.util.DB" />
- <%
- ///图片暂时定为类型,1、电费,2、房租
- //String photo_type_id = request.getParameter("photo_type_id"); ///图片暂时定为类型,1、电费,2、房租
- String group_id = request.getParameter("group_id"); ///合同附件ID
- String pic_id = request.getParameter("pic_id"); ///照片ID
- System.out.println(pic_id);
- response.reset(); ///最关键,否则无法显示
- response.setContentType("image/jpeg");
- db.Init();
- ResultSet rs=null;
- String sql="";
- sql="select group_pic photo from grm_new_group_pic WHERE pic_id='"+pic_id+"'";
- System.out.println(sql);
- rs=db.getSelect(sql);
- try{
- if (rs.next())
- {
- ServletOutputStream sout = response.getOutputStream();
- ///方法1:
- //互联网应用时,如果图片较大(>1M),且网速较低,可以考虑使用以下方式
- //效果,使JPG从上到下分为数分,慢慢展示,类似ACDSEE
- int BUFFER_SIZE=10000;
- InputStream in = rs.getBinaryStream(1);
- byte b[] = new byte[BUFFER_SIZE];
- for (int i = in.read(b,0,BUFFER_SIZE); i!=-1;) {
- ///System.out.println("Read "+i+" bytes.");
- sout.write(b,0,i);
- i=in.read(b,0,BUFFER_SIZE);
- }
- ///方法1结束
- /*
- ///方法2:
- ///下面两行是我用的简单的调用方式,目前没有发现问题,而且效率高,如果不喜欢,可用上面注释的部分代替下面两行代码即可。
- Blob b = rs.getBlob()("photo");
- int size = (int)b.length();
- ///System.out.println(size);
- byte[] image = b.getBytes(1,size);
- sout.write(image);
- /方法2结束
- */
- 下面是公共部分了
- sout.flush();
- sout.close();
- }
- } catch (Exception e) {
- System.out.println(e);
- PrintWriter toClient = response.getWriter(); //得到向客户端输出文本的对象
- response.setContentType("text/html;charset=gb2312");
- toClient.write("无法打开图片!");
- toClient.close();
- }
- ///关闭数据库链接
- rs.close();
- db.setClose();
- %>
好了,具体实现就差不多是这样了。今天就写到这吧。