upload

来源:互联网 发布:淘宝网怎么是电脑版 编辑:程序博客网 时间:2024/05/16 01:36

一、文件的上传

 1.文件上传的原理分析

 1.1文件上传的必要前提

    a、提供form表单 method必须是post

    b、form表单的enctype 必须是 multipart/form-data

    c、提供input type="file"类的上传输入域

 1.2enctype 属性

 作用:告知服务器请求正文MIME类型  

   application/x-www-form-urlencoded(默认)

   正文:name=admin&password=123

   服务器获取数据:String name = request.getParameter("name");

    multipart/form-data:

    正文:


服务器获取数据:request.getParameter(String) 方法获取指定表单字段内容,但是文件上传表单已经不是字符内容而是字节内容所以失效

2、借助第三方的上传组件实现文件上传

2.1 fileupload概述

 fileupload 是由apache的commons组件提供的上传组件,它主要的工作是帮我们解析 request.getInputStream()

a、导入commons-fileupload相关jar

*commons-fileupload.jar,核心包;

* commons-io.jar,依赖包。


2.2fileupload的核心类:

     DiskFileItemFactory、 ServletFileUpload、FileItem

a、 解析原理




2.3 fileupload 简单应用

        使用fileupload组件的步骤如下

       1.创建fileupload组件步骤

      1. 创建工厂类DiskFileItemFactory对象:

           DiskFileItemFactory factory=new DiskFileItemFactory();

       2.使用工厂创建解析器对象

         ServletFileUpload fileUpload=new ServletFileUpload(factory)

      3.使用解析器来解析request对象

         List<FileItem> list=fileUpload.parseRequst(request)



        FileItem 对象对应一个表单项.可以是文件字段或者是普通字段

         boolean  isFormField();判断当前表单字段是否为普通文本字段如果返回false,说明是文件字段;

        String getFieldName():获取字段名称,例如:<input type=”text” name=”username”/>,返回的是username

         String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件是文本文件

     String getName():获取文件字段的文件名称;(a.txt)

     String getContentType():获取上传的文件的MIME类型,例如:text/plain

     int getSize():获取上传文件的大小;

     InputStream getInputStream():获取上传文件对应的输入流;

     void write(File):把上传的文件保存到指定文件中。

     delete();

  3.  文件上传时候注意的几个问题

     a、保证服务器的安全

          把保存上传文件的目录放在用户直接访问不到的地方

    

               b、避免文件被覆盖

             让文件名唯一即可

             

        c、避免同一个文件夹的文件过多

           方案一:按照日期进行打散存储目录


方案二:用文件名的hashCode计算大散的存储目录


  d 、限制文件的大小:web方式不适合上传大的文件

         ServletFileUpload.setFileSizeMax(字节)

         总文件大小:(多文件上传)

         ServletFileUpload.setSizeMax(字节)

    e、上传字段用户没有上传的问题

         通过判断文件名是否为空即可

       f、临时文件的问题

       DiskFileItemFactory:

    作用:产生FileItem对象

    内部有一个缓存,缓存大小默认是10Kb。如果上传的文件超过10Kb,用磁盘作为缓存。

        存放缓存文件的目录在哪里?默认是系统的临时目录。

       如果自己用IO流实现的文件上传,要在流关闭后,清理临时文件。

        FileItem.delete();

   









原创粉丝点击