欢迎使用CSDN-markdown编辑器

来源:互联网 发布:淘宝木子禅佛珠怎么样 编辑:程序博客网 时间:2024/04/29 02:21

java之文件上传

  • 1、文件上传

    文件上传架构(B/S架构),是浏览器和服务器架构,浏览器发出请求,服务器给出响应。

    • 1.1、浏览器部分代码实现
<!-- 设置一个form表单,设置请求方式为post,保证发送数据没有长度限制 -->  <!-- 设置enctype="multipart/form-data" 用来提示当前是文件上传请求 -->  <form action="${root }/upload" method="post" enctype="multipart/form-data">        <!-- 设置一个按钮,让用户可以选择要被上传的文件 -->        请选择要上传的文件:<input type="file" name="upload">        <input type="submit" value="确认上传">   </form>

-1.2、后台部分代码实现

 准备工作:需要的一些jar包         需要使用fileupload组件完成文件上传,这时还需要下载commons-io    的jar包。下载:http://commons.apache.org/proper/commons-fileupload/    commons-fileupload-1.3.1.jar、commons-io-2.4.jar、commons-beanutils-1.8.3.jar、commons-logging-1.1.1.jar、commons-dbutils-1.6.jar代码部分:
public class UploadServlet extends HttpServlet {    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        //使用Fileupload工具,解析文件上传数据        //创建生产表单项的工厂        DiskFileItemFactory factory = new DiskFileItemFactory();        //创建解析request的对象        ServletFileUpload fileUpload = new ServletFileUpload(factory);        //解决上传文件名乱码        upload.setHeaderEncoding("utf-8");        try {            //解析请求对象,将数据解析成一个一个的FileItem            List<FileItem> list = fileUpload.parseRequest(request);            //需要将保存在FileItem中的数据,获取出来            for (FileItem item : list) {                //判断,当前的input数据是text,还是file                if(item.isFormField()){                    //是text,需要展示数据                    //获取name属性值                    String fieldName = item.getFieldName();                    //获取value属性值                    String string = item.getString();                    System.out.println("fieldName:"+fieldName);                    System.out.println("string:"+string);                }else{                    //表示当前是文件上传的数据,将数据保存到服务器硬盘                    //先选择一个文件要保存的路径,后期所有的上传的数据,保存到upload文件夹中                    //如何获取到upload文件加的路径?                    //C:/apache-tomcat-7.0.75/webapps/day24/upload                    String realPath = this.getServletContext().getRealPath("/upload");                    //获取当前被上传文件的文件名                    String fileName = item.getName();                    //将数据输出到指定位置                    item.write(new File(realPath,fileName));                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
  • 2、commons-fileupload 详解(对核心类的API介绍)

    • 2.1DiskFileItemFactory类(磁盘的文件项工厂类)
    • 2.1.1设置缓存大小

      缓存越大,效率越高。Byte[] buf = new byte[8192]缓存:内存中开辟的一个存储数据的空间内存读取效率高于硬盘,设置缓存,提高读取效率,缓存越大,效率越高。factory.setSizeThreshold(1024*1024*10);
    • 2.1.2设置临时文件存储位置

      被上传文件的大小,一定会出现超出缓存大小的情况,这些超出的数据,也需要找一个地方存储(临时)起来factory.setRepository(new File("G:/temp"));
//如何获取当前操作系统的临时文件存储位置://获取当前系统的默认临时文件存储位置        String property = System.getProperty("java.io.tmpdir");
  • 2.2、ServletFileUpload类

    • 2.2.1parseRequest方法,解析request对象,获取文件上传的数据的方法
    • 2.2.2isMultipartContent方法,判断当前请求,是否,是一个文件上传的请求
    • 2.2.3setHeaderEncoding方法,解决中文文件名乱码问题
  • 2.3、FileItem类

    • 2.3.1isFormField方法,判断当前input输入框是否是一个普通字段,true,是,false,不是
    • 2.3.2getFieldName方法,获取input输入框中name属性值
    • 2.3.3getString方法,获取input输入框中,用户输入的值(value值)的方法,getString(“utf-8”)这个方法是用来,处理中文乱码(用户输入的值(value值))
    • 2.3.4getName方法,获取被上传文件的文件名
    • 2.3.5getInputStream方法(不推荐使用),如果使用这个方法,先获取输入流,在获取输出流,继续写IO代码,代码太过繁琐,推荐使用原有的方法
      item.write(new File(realPath,fileName));
//获取输入流//                      InputStream in = item.getInputStream();//                      //获取输出流//                      FileOutputStream out = new FileOutputStream(new File(realPath,fileName));//                      //设置缓存区//                      byte[] buf = new byte[1024];//                      int len = 0;//                      while( (len = in.read(buf)) != -1 ){//                          out.write(buf,0,len);//                      }
    2.3.5 delete方法,删除临时文件的方法,临时文件会自动删除(item.write()),但是,如果发生异常,临时文件有可能没有删出,调用删除方法
  • 2.3浏览器端js实现
    <script type="text/javascript">        //用户自己添加input,用户点击一下,创建一个input        function _addInput(){            //创建一个input输入框            var _input = document.createElement("input");            //设置文件上传相关属性            _input.setAttribute("type", "file");            _input.setAttribute("name", "upload");            //将input标签存入div中(id="_un")            var _div = document.getElementById("_un");            _div.appendChild(_input);            //再提供一个删除的按钮:点击一个删除按钮,删除一个input输入框            var _delete = document.createElement("input");            //设置删除按钮的相关属性            _delete.setAttribute("type", "button");            _delete.setAttribute("value", "删除");            //设置删除按钮的onclick事件,事件(启动一个js函数,执行删除操作)            _delete.onclick = function(){                //执行删除的操作                //删除的内容有:文件上传输入框,删除按钮本身,换行符                //删除操作由父标签执行                //this:代表了当前这个标签对象_delete                var _f = this.parentNode;                //删除  文件上传输入框,先获取当前元素的前一个元素                var _p = this.previousSibling;                _f.removeChild(_p);                //删除   换行符,先获取当前元素的后一个元素                var _n = this.nextSibling;                _f.removeChild(_n);                //自杀                _f.removeChild(this);            };            _div.appendChild(_delete);            //在每一个input输入框之后,加上一个换行符            var _br = document.createElement("br");            _div.appendChild(_br);        }    </script>  <body>  <!-- 设置一个按钮,用来启动js函数,创建文件上传的input输入框 -->  <input type="button" value="添加文件上传" onclick="_addInput();"><br/>  <form action="${root }/upload3" method="post" enctype="multipart/form-data">    文件描述:<input type="text" name="desc"><br/>   <!-- 演示在页面中显示选择文件上传的按钮 -->     请选择要被上传的文件:<input type="file" name="upload"><br/>     <!-- 当前这个div的位置,就是input标签要存放的位置,那么input标签,只要存放在div中,就是放对了位置 -->     <div id="_un">     </div>     <!-- 不要忘了添加表单的提交按钮 -->     <input type="submit" value="文件上传">    </form>  </body>
原创粉丝点击