搞定上传图片的,速度不错

     搞图片上传搞了好久,开始上传大照片时(>2M),老是会出现表被死锁(传小照片不会:<1m),原来的服务器是装在LINUX下,后来换了个服务器,换成WIN 2003 SERVER,就不会出现这种情况了。具体原因嘛,还没有查出来,高手看到,留个言吧~~

    具体的代码如下:

 

选择文件(select_file_upload.jsp:

  1. <%@ page language="java" import="java.util.*"
  2.     pageEncoding="GB2312"%>
  3. <%@ page contentType="text/html; charset=GB2312"%>
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5. <%
  6. String group_id=request.getParameter("group_id"); ///集团ID
  7.  %>
  8. <html>
  9.   <head>
  10.     <title>上传文件</title>
  11.     <meta http-equiv="pragma" content="no-cache">
  12.     <meta http-equiv="cache-control" content="no-cache">
  13.     <meta http-equiv="expires" content="0">    
  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15.     <meta http-equiv="description" content="This is my page">
  16.     <link rel="stylesheet" type="text/css" href="../css/su.css">
  17.   </head>
  18.   <script type="text/javascript">
  19.   function checkpic(){
  20.     var filess=form1.path.value;
  21.     filess=filess.toUpperCase();
  22.     //if(filess.indexOf(".JPG")==-1){
  23.     //alert("您选择的文件格式错误!/r/n/r请重新选择jpg文件!");
  24.     //return false;
  25.     //}
  26.   }
  27.   function uploadpic(){
  28.     if(form1.path.value==""){
  29.         alert("您没有选择要上传的文件!");
  30.         return false;
  31.     }
  32.     //var filess=form1.path.value;
  33.      // filess=filess.toUpperCase();
  34.     //if(filess.indexOf(".JPG")==-1){
  35.     //alert("您选择的文件格式错误!/r/n/r请重新选择jpg文件!");
  36.     //return false;
  37.     //}
  38.     form1.submit();
  39.   }
  40.   </script>
  41.   <body>
  42.   <!--enctype="multipart/form-data" 是 mySmartUpload 的获得数据流的标记 但是有了它 就会影响 REQUEST 获得参数 -->
  43. <form name="form1" method="POST"action="select_file_upload_do.jsp?group_id=<%=group_id%>" ENCTYPE="multipart/form-data">
  44. <table width="90%" height="20" border='1' align='center' cellpadding='2' cellspacing="1" bordercolor='#FFFFFF' bordercolorlight='#0066ff' bordercolordark="#ffffff" bgcolor='#E8F1FF'>
  45.   <tr>
  46.     <th align="center" colspan="100%"><font size="3"><b>请选择图片附件(集团ID:<%=group_id%>)</b></font></th>
  47.   </tr>
  48.    <tr>
  49.     <td colspan="1" height="30"><div align="center" class="input3">请选择:</div></td>
  50.     <td colspan="2"><input name="path" type="file" size="40"οnchange="checkpic()"> </td>    
  51.   </tr>
  52.   <tr>
  53.    
  54.     <td  colspan="100%" height="32" align="center">
  55.     
  56.             <input type="button" value="提交"οnclick="uploadpic()">
  57.                
  58.         <input name="reset" type="reset" value="重设">
  59.                        
  60.         <input name="reset" type="button" value="返回"οnclick="history.go(-1)"></td>
  61.          
  62.   </tr>
  63.   <tr>
  64.     <td height="35" colspan="100">格式说明:推荐选择JPG格式的图片,太大的图片比较浪费空间</td>
  65.   </tr>
  66. </table>
  67. </form >
  68.   </body>
  69. </html>

上传文件处理页面(select_file_upload_do.jsp):

  1. <%@ page language="java" import="java.util.*,java.sql.*,com.grm.util.DB" pageEncoding="GB2312"%>
  2. <%@ page contentType="text/html;   charset=gb2312" language="java"
  3.     import="com.jspsmart.upload.SmartUpload,java.io.*"%>
  4. <%@ page import="oracle.jdbc.OracleResultSet"%> 
  5. <%@ page import="oracle.sql.BLOB"%> 
  6. <jsp:useBean id="ci" scope="page" class="com.grm.util.CreateId" />
  7. <html>
  8.     <head>
  9.         <title>导入ORACLE数据库图片</title>
  10.     </head>
  11.     <body>
  12.         <%
  13.            // String photo_id="";///合同附件ID
  14.             String group_id=request.getParameter("group_id"); ///集团ID
  15.             
  16.             SmartUpload su = new SmartUpload();
  17.             su.initialize(pageContext);
  18.             su.upload();///一定要在最前面!!
  19.             com.jspsmart.upload.File f = su.getFiles().getFile(0);
  20.             ///String name=System.currentTimeMillis()+"."+f.getFileExt(); ///换数字文件名
  21.             String name= f.getFileName() ; ///用上传的文件名
  22.             //String name=new String(f.getFileName().getBytes("ISO-8859-1"),"gb2312"); //解决LINIX下中文乱码问题
  23.             f.saveAs("/upload_file/"   +   name,   su.SAVE_VIRTUAL); //另存为 远程目录
  24.             //f.saveAs("/upload_file/"   +   name,   su.SAVE_VIRTUAL); //另存为  本地目录
  25.             java.io.File file = new java.io.File(request.getRealPath("../")+"upload_file/" + name);//获得该文件
  26.             //System.out.println(name);
  27.              ///fs就是要写入的图片文件
  28.              name=file.getName();
  29.              System.out.println(name);
  30.             FileInputStream fs=new FileInputStream(file); 
  31.             
  32.             上传图片到服务器
  33.             准备插入到ORACLE
  34.             DB db=new DB();
  35.             db.Init();
  36.             
  37.             Connection conn=db.getConn();
  38.             String pic_id=ci.getMaxId("grm_new_group_pic","pic_id");
  39.             ci.setClose();
  40.              /* 设定不自动提交 */
  41.             boolean defaultCommit = conn.getAutoCommit();
  42.             conn.setAutoCommit(false);
  43.             
  44.             ResultSet rs=null;
  45.             PreparedStatement stmt=null;
  46.             
  47.             try{
  48.             
  49.              String sql1="insert into grm_new_group_pic(pic_id,pic_name,group_id,group_pic) values('"+pic_id+"','"+name+"','"+group_id+"',empty_blob())";
  50.              System.out.println(sql1);
  51.              stmt=conn.prepareStatement(sql1);
  52.              stmt.executeUpdate(sql1);
  53.              stmt.clearParameters();   
  54.    
  55.              stmt   =   conn.prepareStatement("SELECT   group_pic   FROM   grm_new_group_pic   WHERE   pic_id  =   ?   FOR   UPDATE",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_UPDATABLE);
  56.              stmt.setString(1,pic_id);   
  57.              rs=stmt.executeQuery(); 
  58.               if   (!su.getFiles().getFile(0).isMissing())
  59.                  {
  60.                     try   
  61.                     {   
  62.                     /*
  63.                          if (rs.next()) 
  64.                          {
  65.                          //得到java.sql.Blob对象,然后Cast为oracle.sql.BLOB
  66.                          oracle.sql.BLOB   blob   =   ((oracle.jdbc.OracleResultSet)rs).getBLOB(1);                 
  67.                          //到数据库的输出流
  68.                          OutputStream outStream = blob.getBinaryOutputStream();
  69.                          //将输入流写到输出流
  70.                          byte[] b = new byte[blob.getBufferSize()];
  71.                          int len = 0;
  72.                          while ( (len = fs.read(b)) != -1) {
  73.                          outStream.write(b, 0, len);
  74.                          }
  75.                           //依次关闭(注意顺序)
  76.                          fs.close();
  77.                          outStream.flush();
  78.                          outStream.close();       
  79.                          }  
  80.                         */
  81.                         
  82.                         if(rs.next()){
  83.                         oracle.sql.BLOB   blob   =   ((oracle.jdbc.OracleResultSet)rs).getBLOB(1);   
  84.                               
  85.                         OutputStream   outStream   =   blob.getBinaryOutputStream();   
  86.     
  87.                         byte[]   bytes   =   new   byte[(int)file.length()];   
  88.                         fs.read(bytes);   
  89.                         outStream.write(bytes); 
  90.                         
  91.                         fs.close();
  92.                         outStream.flush();
  93.                         outStream.close(); 
  94.                         }
  95.                       }   
  96.                      catch(Exception   e)   
  97.                       {   
  98.                           conn.rollback();
  99.                           conn.setAutoCommit(defaultCommit);  //恢复默认自动提交
  100.                           rs.close();
  101.                           stmt.close();   
  102.                           db.setClose();
  103.                           file.delete();
  104.                           out.println("An   error   occurs   :   "   +   e.toString());
  105.                           out.println("<script language=/'javascript/'>alert('上传出错啦!请重新上传~!~');history.go(-1);</script>");   
  106.                       }   
  107.                  }   
  108.                
  109.              conn.commit();
  110.              conn.setAutoCommit(defaultCommit);  //恢复默认自动提交
  111.              rs.close();
  112.              stmt.close();   
  113.              db.setClose();
  114.              file.delete();
  115.              out.print("<script>alert('操作成功!');window.location='../new_group/group_manage_frame.jsp?group_id="+group_id+"';</script>");
  116.             }
  117.             catch(Exception e)
  118.             {
  119.                           conn.rollback();
  120.                           conn.setAutoCommit(defaultCommit);  //恢复默认自动提交
  121.                           rs.close();
  122.                           stmt.close();   
  123.                           db.setClose();
  124.                           file.delete();
  125.                           out.println("An   error   occurs   :   "   +   e.toString());
  126.                           out.println("<script language=/'javascript/'>alert('上传出错啦!请重新上传~!~');history.go(-1);</script>");     
  127.             }
  128.           %>
  129.     </body>
  130. </html>

显示照片(showpic_do。jsp):

  1. <%
  2. /*
  3. 模块说明书:
  4. 本模块输入参数       :
  5. 本模块输出          :显示附件图片
  6. 本模块主要编写人     :
  7. 本模块特别注意事项   :无
  8. 最后编辑日期        :2008-07-27
  9. */
  10. %>
  11. <%@ page contentType="text/html;charset=gb2312" %>
  12. <%@ page import="java.io.*"%>
  13. <%@ page import="java.sql.*, javax.sql.*" %>
  14. <%@ page import="javax.imageio.*" %>
  15. <%@ page import="java.util.*"%>
  16. <jsp:useBean id="db" scope="page" class="com.grm.util.DB" />
  17. <%
  18.     ///图片暂时定为类型,1、电费,2、房租   
  19.     //String photo_type_id = request.getParameter("photo_type_id"); ///图片暂时定为类型,1、电费,2、房租
  20.     String group_id = request.getParameter("group_id"); ///合同附件ID
  21.     String pic_id = request.getParameter("pic_id"); ///照片ID
  22.     System.out.println(pic_id);
  23.     response.reset(); ///最关键,否则无法显示
  24.     response.setContentType("image/jpeg");          
  25.     db.Init();
  26.     ResultSet rs=null;
  27.     String sql="";
  28.    sql="select group_pic photo  from grm_new_group_pic WHERE pic_id='"+pic_id+"'";
  29.    System.out.println(sql);
  30.    rs=db.getSelect(sql);
  31.    try
  32.         if (rs.next()) 
  33.          {
  34.               ServletOutputStream   sout   =   response.getOutputStream();   
  35.               ///方法1:
  36.               //互联网应用时,如果图片较大(>1M),且网速较低,可以考虑使用以下方式   
  37.               //效果,使JPG从上到下分为数分,慢慢展示,类似ACDSEE   
  38.               int   BUFFER_SIZE=10000;   
  39.               InputStream   in   =   rs.getBinaryStream(1);   
  40.             byte   b[]   =   new   byte[BUFFER_SIZE];   
  41.             for   (int   i   =   in.read(b,0,BUFFER_SIZE);   i!=-1;)   {   
  42.                         ///System.out.println("Read   "+i+"   bytes.");   
  43.                         sout.write(b,0,i);   
  44.                         i=in.read(b,0,BUFFER_SIZE);   
  45.                         } 
  46.               ///方法1结束            
  47.                /*  
  48.               ///方法2:              
  49.               ///下面两行是我用的简单的调用方式,目前没有发现问题,而且效率高,如果不喜欢,可用上面注释的部分代替下面两行代码即可。   
  50.               Blob b = rs.getBlob()("photo");
  51.             int  size = (int)b.length();
  52.               ///System.out.println(size);
  53.             byte[] image = b.getBytes(1,size);
  54.               sout.write(image);
  55.               /方法2结束
  56.              */    
  57.               下面是公共部分了
  58.               sout.flush();   
  59.               sout.close();   
  60.            }   
  61.        }   catch   (Exception   e)   {   
  62.                           System.out.println(e);   
  63.                           PrintWriter   toClient   =   response.getWriter();   //得到向客户端输出文本的对象   
  64.                           response.setContentType("text/html;charset=gb2312");   
  65.                           toClient.write("无法打开图片!");   
  66.                           toClient.close();
  67.                            
  68.                   } 
  69. ///关闭数据库链接                    
  70. rs.close(); 
  71. db.setClose();
  72. %>

     好了,具体实现就差不多是这样了。今天就写到这吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值