利用commons-fileupload组件上传文件至服务器和数据库(ZT)

 

common-fileupload是jakarta项目组开发的一个功能很强大的上传文件组件

下面先介绍上传文件到服务器(多文件上传):

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;

public class upload extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html; charset=GB2312";
  //Process the HTTP Post request
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType(CONTENT_TYPE);
    PrintWriter out=response.getWriter();
    try {
    DiskFileUpload fu = new DiskFileUpload();
 // 设置允许用户上传文件大小,单位:字节,这里设为2m
 fu.setSizeMax(2*1024*1024);
 // 设置最多只允许在内存中存储的数据,单位:字节
 fu.setSizeThreshold(4096);
 // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
 fu.setRepositoryPath("c:\\windows\\temp");
 //开始读取上传信息
 List fileItems = fu.parseRequest(request);
 // 依次处理每个上传的文件
   Iterator iter = fileItems.iterator();

//正则匹配,过滤路径取文件名
   String regExp=".+\\\\(.+)$";

//过滤掉的文件类型
String[] errorType={".exe",".com",".cgi",".asp"};
   Pattern p = Pattern.compile(regExp);
      while (iter.hasNext()) {
       FileItem item = (FileItem)iter.next();
       //忽略其他不是文件域的所有表单信息
       if (!item.isFormField()) {
           String name = item.getName();
           long size = item.getSize();
           if((name==null||name.equals("")) && size==0)
               continue;
        Matcher m = p.matcher(name);
       boolean result = m.find();
       if (result){
           for (int temp=0;temp           if (m.group(1).endsWith(errorType[temp])){
                 throw new IOException(name+": wrong type");
           }
           }
           try{

//保存上传的文件到指定的目录

//在下文中上传文件至数据库时,将对这里改写
             item.write(new File("d:\\" + m.group(1)));

           out.print(name+"  "+size+"
");
           }
           catch(Exception e){
             out.println(e);
           }

        }
       else
       {
         throw new IOException("fail to upload");
       }
       }
   }
}
 catch (IOException e){
   out.println(e);
 }
 catch (FileUploadException e){
      out.println(e);
 }
 
  }
}

下面是个html的上传页面:

文件上传演示

       

       

       

       

       

                        文件1:

       

                        文件2:

       

                        文件3:

       

       

       

       

      

现在介绍上传文件到服务器,下面只写出相关代码:

以sql2000为例,表结构如下:

字段名:name    filecode

类型: varchar     image

数据库插入代码为:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");

代码如下:

。。。。。。

           try{
             //item.write(new File("d:\\" + m.group(1)));//这段代码如果不去掉,将一同写入到服务器中

             int byteread=0;

             InputStream inStream=item.getInputStream();  //读取输入流,也就是上传的文件内容
             pstmt.setString(1,m.group(1));
             pstmt.setBinaryStream(2,inStream,(int)size);
             pstmt.executeUpdate();
             inStream.close();

             out.println(name+"  "+size+"
");
           }

。。。。。。

这样就实现了上传文件至数据库


感谢

11:36 | 评论 (0)

Smartupload和commons-fileupload介绍与比较(ZT)

WEB文件上传可能是网站建设中最常用的功能之一,我在项目开发中几乎都需要实现文件上传功能.前段时间自己搜集了一些上传组件.这篇文章中将介绍这些组件的使用方法,并且比较各自的优劣.

一,smartupload组件.

我想只要做个文件上传的朋友都知道这个组件,我认识的人中使用最多的也是它!我刚到公司的时候,公司也使用的smartupload,这个组件上传相对较小的文件时是个不错的选择.下面给出个使用的例子:

<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.sql.*"%><%@ page import="com.jspsmart.upload.*" %>

<%   //实例化上载bean    SmartUpload mySmartUpload=new SmartUpload();    //初始化    mySmartUpload.initialize(pageContext);     //设置上载的最大值,注意:如果这里设置过大会出现问题!    mySmartUpload.setMaxFileSize(500 * 1024*1024);    //上载文件    mySmartUpload.upload();   //循环取得所有上载的文件   for (int i=0;i<mySmartUpload.getFiles().getCount();i++){   //取得上载的文件   com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);   if (!myFile.isMissing())    {   //取得上载的文件的文件名    String myFileName=myFile.getFileName();    //取得不带后缀的文件名    String  suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));    //取得后缀名    String  ext= mySmartUpload.getFiles().getFile(0).getFileExt();      //取得文件的大小      int fileSize=myFile.getSize();    //保存路径    String aa=getServletContext().getRealPath("/")+"jsp\\";    String trace=aa+myFileName;    //取得别的参数    String explain=(String)mySmartUpload.getRequest().getParameter("text");    String send=(String)mySmartUpload.getRequest().getParameter("send");    //将文件保存在服务器端     myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);    %>  <%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.sql.*"%><%@ page import="com.jspsmart.upload.*" %>

但是使用smartupload上传过大文件,或者多文件的时候可能出现CPU或内存占用过高的问题.并且:只有重新启动容器才能恢复正常!这正是我最后我放弃了使用smartupload的原因.

二,commons-fileupload组件

这个组件是我现在使用的组件,下载地址:http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi,包内包含了API文档.

使用该组件的例子:

<%@ page language=“java”contentType=“text/html;charset=GBK”%><%@ page import=“java.util.*”%><%@ page import=“org.apache.commons.fileupload.*”%><% DiskFileUpload fu = new DiskFileUpload(); // 设置允许用户上传文件大小,单位:字节 fu.setSizeMax(10000000); // 设置最多只允许在内存中存储的数据,单位:字节 fu.setSizeThreshold(4096); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”); //开始读取上传信息 List fileItems = fu.parseRequest(request); // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) {  FileItem item = (FileItem) iter.next();  //忽略其他不是文件域的所有表单信息  if (!item.isFormField()) {   String name = item.getName();   item.write(“D:\\UploadTest\\”+ name); }}%><%@ page language=“java”contentType=“text/html;charset=GBK”%><%@ page import=“java.util.*”%><%@ page import=“org.apache.commons.fileupload.*”%><html><head><title>文件上传</title></head><% DiskFileUpload fu = new DiskFileUpload(); // 设置允许用户上传文件大小,单位:字节 fu.setSizeMax(10000000); // 设置最多只允许在内存中存储的数据,单位:字节 fu.setSizeThreshold(4096); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”); //开始读取上传信息 List fileItems = fu.parseRequest(request); // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) {  FileItem item = (FileItem) iter.next();  //忽略其他不是文件域的所有表单信息  if (!item.isFormField()) {   String name = item.getName();   item.write(“D:\\UploadTest\\”+ name); }}%>

从上面的程序可以看出,该组件上传时候可以用了一个地方来存储临时文件,呆上传完成后直接把文件写过去.这样就不会占用过多的内存!而且该组件上传大文件的时候效率也不低哦!

在这两个的对比选择中,我选择了后者,因为我做的项目中经常上传大于10M的文件,用前者的时候服务器几乎被整崩溃.

不过,现在我已经不用这两种组件了,因为http方式传文件效率始终很低,我们现在使用的是web方式实现的ftp文件上传,我将在下篇文章中写我在项目中是如何实现的.

感谢
http://java.mblogger.cn/Elune

posted on 2005-08-01 16:08  轻松逍遥子  阅读(2225)  评论(0编辑  收藏  举报