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

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<errorType.length;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+"&nbsp;&nbsp;"+size+"<br>");
           }
           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的上传页面:

<h1>文件上传演示</h1>

<form name="uploadform" method="POST" action="/upload" ENCTYPE="multipart/form-data">

        <table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">

        <tr><td width="100%" colspan="2">

                        文件1:<input name="x" size="40" type="file">

        </td></tr>

        <tr><td width="100%" colspan="2">

                        文件2:<input name="y" size="40" type="file">

        </td></tr>

        <tr><td width="100%" colspan="2">

                        文件3:<input name="z" size="40" type="file">

        </td></tr>

        </table>

        <br/><br/>

        <table>

        <tr><td align="center"><input name="upload" type="submit" value="开始上传"/></td></tr>

       </table>

</form>

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

以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+"&nbsp;&nbsp;"+size+"<br>");
           }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FileUpload获取表单中参数的方法并对该组件做了进一点封装,使其更容易使用,并支持单文件上传和多文件上传两种方式,首先定义一个基类放置公共属性: FileUploadBase.java import java.io.File; import java.util.HashMap; import java.util.Map; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public abstract class FileUploadBase { protected Map<String, String> parameters = new HashMap<String, String>();// 保存普通form表单域 protected String encoding = "utf-8"; // 字符编码,当读取上传表单的各部分时会用到该encoding protected UploadFileFilter filter = null; // 文件过滤器, 默认为NULL 不过滤 /** * 设置内存中缓存大小。 */ protected int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD; /** * The maximum size permitted for the complete request, as opposed to *{@link #fileSizeMax}. A value of -1 indicates no maximum.* */ protected long sizeMax = -1; /** * 在sizeThreshold超出缓存区时临时保存的文件目录 */ protected File repository; public String getParameter(String key) { return parameters.get(key); } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } /** * 获取上传文件最大的大小,单位为Byte(字节),为-1时表示无限制 * @return */ public long getSizeMax() { return sizeMax; } /** * 设置上传文件最大的大小,单位为Byte(字节),为-1时表示无限制 * @param sizeMax */ public void setSizeMax(long sizeMax) { this.sizeMax = sizeMax; } public int getSizeThreshold() { return sizeThreshold; } public void setSizeThreshold(int sizeThreshold) { this.sizeThreshold = sizeThreshold; } /** * Returns the directory used to temporarily store files that are larger * than the configured size threshold. * * @return The directory in which temporary files will be located. * * @see #setRepository(java.io.File) * */ public File getRepository() { return repository; } /** * Sets the directory used to temporarily store files that are larger than * the configured size threshold. * * @param repository * The directory in which temporary files will be located. * * @see #getRepository() * */ public void setRepository(File repository) { this.repository = repository; } /** * 获取参数列表 * @return */ public Map<String, String> getParameters() { return parameters; } /** * 获取过滤器 * @return */ public UploadFileFilter getFilter() { return filter; } /** * 设置文件过滤器,不符合过滤器规则的将不被上传 * @param filter */ public void setFilter(UploadFileFilter filter) { this.filter = filter; } /** * 验证文件是否有效 * @param item * @return */ protected boolean isValidFile(FileItem item){ return item == null || item.getName() == "" || item.getSize() == 0 || (filter != null && !filter.accept(item.getName())) ? false : true; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值