File,DiskFileItemFactory,ServletFileUpload,File...

  将请求消息实体中的每个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务
由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,可是内存资源是有限的)。html

属性
1) public static final int DEFAULT_SIZE_THRESHOLD :将文件保存在内存仍是磁盘临时文件夹的默认临界值,值为10240,即10kb。
java

2) private File repository:用于配置在建立文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,能够经过系统属性 java.io.tmpdir获取。以下代码: web

System.getProperty("java.io.tmpdir"); 数据库

3) private int sizeThreshold:用于保存将文件保存在内存仍是磁盘临时文件夹的临界值 apache

构造方法
1) public DiskFileItemFactory()
缓存

      采用默认临界值和系统临时文件夹构造文件项工厂对象。 tomcat

2) public DiskFileItemFactory(int sizeThreshold,File repository) 网络

      采用参数指定临界值和系统临时文件夹构造文件项工厂对象。 jsp

3) FileItem createItem()
       根据DiskFileItemFactory相关配置将每个请求消息实体项目建立成DiskFileItem 实例,并返回。该方法历来不须要咱们亲自调用,FileUpload组件在解析请求时内部使用。
post

4) void setSizeThreshold(int sizeThreshold)
        Apache文件上传组件在解析上传数据中的每一个字段内容时,须要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。由于Java虚拟机默承认以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。若是上传的文件很大,例如800M的文件,在内存中将没法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但若是上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。

        setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),若是从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值。

5) void setRepository(File repository)
        setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的得到临时文件夹的 File getRespository() 方法。

         注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,能够经过系统属性 java.io.tmpdir 获取。以下代码:

System.getProperty("java.io.tmpdir");

Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”。


使用common-fileUpload制做文件上传(DiskFileItemFactory方式)  

所需包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar

在网络找了关于JSP上传文件问题,原本想作个利用AJAX作带进度条的文件上传功能,可是网络上的文章都比较复杂,看了半天都看不懂,发现本身连最简单的文件上传都没有作过,那个就暂时算了,老实点从简单的先作起再研究那个带进度条的文件上传。
       在网络上找了下jsp上传文件的代码,有不少,可是多数人写的不清楚,不过找了一个稍微清楚点的文章,文章地址给忘了(,真对不起人家,作人还不够厚道)。下面基本原封不动的把代码贴上来,以备后用。
首先下载:commons-fileUpload-1.2 的jar包:http://www.apache.org/commons/,同时能够把commons-IO的jar包一块儿下载,之后会用到的。
一、上传的前台页面:
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%>
<html>
<body>
    <form action="MultipartTestServlet" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
     <input type="file" name="myfile" /><br/>
     <input type="file" name="myfile" /><br/>
     <input type="submit" />
    </form>
</body>
</html>
二、上传的后台代码:
       后台代码是个servlet,很简单咯,以为比ASP利用组件还简单。呵呵
package upload;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
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.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
public class MultipartTestServlet extends HttpServlet {
public MultipartTestServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
//设置request编码,主要是为了处理普通输入框中的中文问题
request.setCharacterEncoding("gbk");
//这里对request进行封装,RequestContext提供了对request多个访问方法
RequestContext requestContext = new ServletRequestContext(request);
//判断表单是不是Multipart类型的。这里能够直接对request进行判断,不过已经之前的用法了
if(FileUpload.isMultipartContent(requestContext)){
   DiskFileItemFactory factory = new DiskFileItemFactory();
   //设置文件的缓存路径
   factory.setRepository(new File("c:/tmp/"));
   ServletFileUpload upload = new ServletFileUpload(factory);
   //设置上传文件大小的上限,-1表示无上限 
   upload.setSizeMax(100*1024*1024);
   List items = new ArrayList();
    try {
        //上传文件,并解析出全部的表单字段,包括普通字段和文件字段
     items = upload.parseRequest(request);
    } catch (FileUploadException e1) {
     System.out.println("文件上传发生错误" + e1.getMessage());
    }
     //下面对每一个字段进行处理,分普通字段和文件字段
   Iterator it = items.iterator();
   while(it.hasNext()){
    FileItem fileItem = (FileItem) it.next();
    //若是是普通字段
    if(fileItem.isFormField()){   
     System.out.println(fileItem.getFieldName() + "   " + fileItem.getName() + "   " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
    }else{
     System.out.println(fileItem.getFieldName() + "   " +
        fileItem.getName() + "   " +
        fileItem.isInMemory() + "    " +
        fileItem.getContentType() + "   " +
        fileItem.getSize());
     //保存文件,其实就是把缓存里的数据写到目标路径下
     if(fileItem.getName()!=null && fileItem.getSize()!=0){
      File fullFile = new File(fileItem.getName());
      File newFile = new File("c:/temp/" + fullFile.getName());
      try {
       fileItem.write(newFile);
      } catch (Exception e) {
       e.printStackTrace();
      }
     }else{
      System.out.println("文件没有选择 或 文件内容为空");
     }
    }
   }
}
}
}
三、编译和配置servlet        先设置classpath,使它包含commons-fileUpload的jar包路径,而后进行编译便可,注意这里的包路径。        而后打开站点下的web-inf路径下的web.xml,在里面添加: <servlet>       <servlet-name>MultipartTestServlet</servlet-name>       <servlet-class>upload.MultipartTestServlet</servlet-class> </servlet>      <servlet>       <servlet-name>dispatcher</servlet-name>       <servlet-class>helloApp.DispatcherServlet</servlet-class> </servlet> 好了,如今就能够文件上传了,不过运行以前记得在c:\下新建tmp和temp文件夹,别忘了,否则程序会报告错误的

相关文章
相关标签/搜索