Apache的commons fileupload上传文…

<form   name= "form"   action= "/struts/UploadServlet"   method= "post"   enctype= "multipart/form-data" >
    
        username: <input   type= "text"   name= "username"   /><br>
        
        password: <input   type= "password"   name= "password"   /><br>
        
        file1: <input   type= "file"   name= "file1"   /><br>
        
        file2: <input   type= "file"   name= "file2"   /><br>
        
         <input   type= "submit"   name= "submit"   value= " submit "   />
        
</form>

注意:文件上传中,form的method一定要设为" post "方法。另外enctype的属性值应该为“ multipart/form-data ”,默认的为" application/x-www-form-urlencoded "

后台servlet处理:UploadServlet.java

package  com . servlet;

import  java.io.File;
import  java.io.FileOutputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.OutputStream;
import  java.util.List;

import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

import  org.apache.commons.fileupload.FileItem;
import  org.apache.commons.fileupload.disk.DiskFileItemFactory;
import  org.apache.commons.fileupload.servlet.ServletFileUpload;

public  class  UploadServlet  extends  HttpServlet  {
        @SuppressWarnings( "unchecked")
        public  void  doPost( HttpServletRequest  request ,  HttpServletResponse  response)
                        throws  ServletException ,  IOException  {
               
                DiskFileItemFactory  factory  =  new  DiskFileItemFactory();
    factory.setSizeThreshold(2 * 1024 * 1024);
    factory.setRepository(tempPath);
         String   path   =   request . getRealPath ( "/upload" );  //存储文件的临时的路径
         factory . setRepository ( new   File ( path ));
         //设置上传工厂的限制
         factory . setSizeThreshold ( 1024   *   1024 );//上传限制 默认的是10K
         //设置一个上传的ServletFileUPload对象
         ServletFileUpload   upload   =   new   ServletFileUpload ( factory );
         try   {
             //处理HTTP请求,item是所有的表单项
             List < FileItem >   list   =   upload . parseRequest ( request );
             //遍历所有的表单项
             for  ( FileItem   item   :   list {
                 if  ( item . isFormField ())  {      //上传的类型分为表单域和非表单域
                     String   name   =   item . getFieldName ();
                    
                     System . out . println ( "----name=" + name );
                    
                     String   value   =   item . getString ( "gbk" );
                    
                     request . setAttribute ( name ,   value );
                 }   else   {
                      FileOutputStream fos = null;
String path = this.getServletContext().getRealPath( "/image");
if (item.isInMemory()) {  //在内存中 //此处有个简单的写文件的方法 write()
byte[] buff = item.get();
String fileNameStr = item.getName();
int position = fileNameStr.lastIndexOf("\");
String fileName = fileNameStr .substring(position + 1);
photourl = fileName;
fos = new FileOutputStream(path + "\" + fileName);
fos.write(buff);
fos.close();
} else {//不在内存中
byte[] buff = new byte[4 * 1024];
InputStream is = item.getInputStream();
int size = 0;
String fileNameStr = item.getName();
int position = fileNameStr.lastIndexOf("\");
String fileName = fileNameStr.substring(position);
photourl = fileName;
fos = new FileOutputStream(path + "\" + fileName);
while ((size = is.read(buff)) != -1) {
fos.write(buff, 0, size);
}
fos.close();
is.close();
                 }
             }
         }   catch  ( Exception   e {
             e . printStackTrace ();
         }

         request . getRequestDispatcher ( "upload/result.jsp" ). forward ( request ,
                 response );
     }

}

在此解释一下commons-fileupload组件中几个方法的含义:
表单域分成两种,一种是文件域,一种是非文件域。common-fileupload框架都把它们当成FileItem对象处理,如果该对象的isFromField()方法返回true,表明该表单域是一个非文件域,否则是一个文件域。
FileItem类包含如下几个方法:
getFieldName() :取得该表单域的name属性值
getString(String encoding) :取得该表单域的value属性值,其中encoding参数设置该表单域的编码集。
getName() :仅当该表单域是文件域时,该方法才有效,该方法返回上传文件的文件名

fileupload中的    DiskFileItemFactory 中的 setThreshold()是设置一个阀值 默认为10k 在阀值以内的文件的大小被保存在内存中 超过了阀值的就被保存在硬盘上的临时的目录中 ,就是setRepository()的目录中。

清除临时的文件的办法;一下是文档说明:

This section applies only, if you are using the DiskFileItem. In other words, it applies, if your uploaded files are written to temporary files before processing them.

Such temporary files are deleted automatically, if they are no longer used (more precisely, if the corresponding instance of java.io.File is garbage collected. This is done silently by the org.apache.commons.io.FileCleaner class, which starts a reaper thread.

This reaper thread should be stopped, if it is no longer needed. In a servlet environment, this is done by using a special servlet context listener, calledFileCleanerCleanup. To do so, add a section like the following to your web.xml:

<web-app>
  ...
  <listener>
    <listener-class>
      org.apache.commons.fileupload.servlet.FileCleanerCleanup
    </listener-class>
  </listener>
  ...
</web-app>

感觉他写的内容少了点,我补上了些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值