文件上传

文件上传

说明:
文件上传流程
:把request对象封装成fileitem对象存于磁盘或内存,获取ftp服务器地址和端口号,用storeFile方法将字节流写到服务器,服务器反序列化为文件
文件上传——getUploadFileInfo()
将文件信息封装成单独的DiskFileItem对象

对于文件上传,上传的过程中是将文件以字节流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件

public static Object[] getUploadFileInfo(HttpServletRequest request) throws Exception {
    Object[] obj = new Object[2];
    //获取会话
    HttpSession session = request.getSession();
    try {
    创建一个ApacheFileUploadListener监听器
        ApacheFileUploadListener e = new ApacheFileUploadListener((long)request.getContentLength());
    设置文件上传状态
        session.setAttribute("FILE_UPLOAD_STATS", e.getFileUploadStats());
    设置文件状态未上传完成
        session.setAttribute("FILE_UPLOAD_FINISH", "N");
     //1、创建一个DiskFileItemFactory工厂
        MonitoredDiskFileItemFactory msg1 = new MonitoredDiskFileItemFactory(e);
      //2、创建一个文件上传解析器
        ServletFileUpload upload = new ServletFileUpload(msg1);
    4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
        List items = upload.parseRequest(request);
        ArrayList FileLists = new ArrayList();
        HashMap ParamMap = new HashMap();
        Iterator i = items.iterator();

        while(true) {
            while(i.hasNext()) {
                FileItem fileItem = (FileItem)i.next();
                //文件对象
                if(!fileItem.isFormField() && !"".equals(fileItem.getName().trim())) {
                    FileLists.add(fileItem);
                } else {
                //普通表单对象
                    String aParamName = fileItem.getFieldName();
                    String aParamValue = fileItem.getString();
                    ParamMap.put(aParamName, aParamValue);
                }
            }

            obj[0] = FileLists;
            obj[1] = ParamMap;
            session.setAttribute("FILE_UPLOAD_FINISH", "Y");
            return obj;
        }
    } catch (Exception var13)


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

DiskFileItemFactory实现了FileItemFactory接口 
属性
1) public static final int DEFAULT_SIZE_THRESHOLD :将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。
2) private File repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 Java.io.tmpdir获取。如下代码:
System.getProperty("java.io.tmpdir");
3) private int sizeThreshold:用于保存将文件保存在内存还是磁盘临时文件夹的临界值
构造方法
1) public DiskFileItemFactory()
      采用默认临界值和系统临时文件夹构造文件项工厂对象。
2) public DiskFileItemFactory(int sizeThreshold,File repository)
      采用参数指定临界值和系统临时文件夹构造文件项工厂对象。
3) FileItem createItem() 
       根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。
4) void setSizeThreshold(int sizeThreshold)
        Apache文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,例如800M的文件,在内存中将无法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。
        setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值。
5) void setRepository(File repository)
        setRepository方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的 File getRespository() 方法。
         注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取。如下代码:
System.getProperty("java.io.tmpdir");
Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”。

FileItem类实现了Serializable接口(网络传输)
 FileItem类的常用方法
      1.boolean  isFormField()。isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段。如果是普通文本表单字段,返回一个true否则返回一个false。因此可以用该方法判断是否是普通表单域还是文件上传表单域。
      2.String getName()。getName方法用来获得文件上传字段中的文件名。
      3.String getFieldName()。getFieldName方法用来返回表单标签的name属性的值。
      4.void write(File file)。write方法将FileItem对象中的内容保存到某个指定的文件中。如果FileItem对象中的内容是保存在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用途是把上传的文件内容保存在本地文件系统中。
      5.String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。它有两个重载形式。public Java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码。如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
      6.String getContentType()。此方法用来获得上传文件的类型,即标段字段元素描述头属性“content-type”的值,如image/jpeg。如果FileItem对象对应的是普通的表单字段,将返回null。
      7.boolean isInMemory()。判断FileItem对象封装的数据是保存在内存中还是硬盘中。
      8.void  delete()。此方法用来清空FileItem对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文件删除。
      9.InputStream  getInputStream()。以流的形式返回上传文件的主体内容。
      10.long  getSize()。返回上传文件的大小。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值