文件上传 - JAVA原生

来源:互联网 发布:spss调查问卷数据录入 编辑:程序博客网 时间:2024/05/01 03:03

DiskFileItemFactory类

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

ServletFileUpload 类

org.apache.commons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的
核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口)。
使用其 parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。

FileItem

FileItem类用来封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem对象,通过调用FileItem对象的方法可以获得相关表单字段元素的数据。FileItem是一个接口,在应用程序中使用的实际上是该接口一个实现类,该实现类的名称并不重要,程序可以采用FileItem接口类型来对它进行引用和访问,为了便于讲解,这里将FileItem实现类称之为FileItem类。FileItem类还实现了Serializable接口,以支持序列化操作。

【1】后台Servlet

package com.file.servlet;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.io.Reader;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.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class UploadServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        request.setCharacterEncoding("UTF-8");        response.setContentType("text;charset=UTF-8");        /*使用输入流读取*///      String file = request.getParameter("file");//      String desc = request.getParameter("desc");//      System.out.println(file+","+desc);//      InputStream in2 = request.getInputStream();//      Reader reader = new InputStreamReader(in2);//      BufferedReader bufferedReader = new BufferedReader(reader);        /*逐行读出*///      String str = null;//      if ((str = bufferedReader.readLine())!=null) {//          System.out.println(str);//          //      }        /*1.得到FiletItem的集合Items*/        DiskFileItemFactory factory = new DiskFileItemFactory();        /*设置单位文件最大500K,只要超过500k,将会先上传到临时目录下面*/        factory.setSizeThreshold(1024*500);        /*创建临时目录*/        File temDirectory = new File("d:\\temDirectory");        if (!temDirectory.exists()) {            temDirectory.mkdir();        }        //设置临时目录        factory.setRepository(temDirectory);        /*create a new file upload handler*/        ServletFileUpload upload = new ServletFileUpload(factory);        /*the all max to be 10M*/        upload.setSizeMax(1024*1024*10);        /*2.遍历items,若是一个一般的表单域,打印信息;若是文件域保存到硬盘一个位置*/        try {            List<FileItem> items = upload.parseRequest(request);            for(FileItem item:items){                if (item.isFormField()) {                    /*获取文件原始名*/                    //String name = item.getName();                    /*获取表单域中的文件名*/                    String filedName1 = item.getFieldName();                    String value = item.getString();                    System.out.println(filedName1+"--"+value);                }else {                    //获取表单中标签的name属性值                    String filedName = item.getFieldName();                    //获取表单中上传的文件名                    String fileName = item.getName();                    /*若返回的为路径+文件名,则需要截取*/                    int index=fileName.lastIndexOf("\\");                    //System.out.println(index);                    if(index!=-1) {                        /*从索引出开始知道字符串末尾 索引从“0”开始*/                        fileName=fileName.substring(index+1);                    }                    String contentType = item.getContentType();                    long sizeInBytes = item.getSize();                    System.out.println("filedName :"+filedName);                    System.out.println("fileName :"+fileName);                    System.out.println("contentType :"+contentType);                    System.out.println("sizeInBytes :"+sizeInBytes);                    /*从item拿到输入流*/                    InputStream in = item.getInputStream();                    byte[] buffer = new byte[1024];                    int len = 0;                    /*也可称为filePath,文件保存到磁盘的路径+名字*/                    //上传到本机D盘                    //fileName = "d:\\files\\"+fileName;                    //上传服务器目录下D:\apache-tomcat-7.0.40\webapps\JAVAWeb-FileUpload\resources\1.jpg                    String path = getServletContext().getRealPath("/");                    fileName = path+"resources\\"+fileName;                    //上传到本机D盘 D:\\upload\resources                    //fileName = "D:\\upload\\resources\\"+fileName;                    //此时jsp若想请求该图片,则需要在Tomcat做目录映射,请查阅目录映射资料                    System.out.println(fileName);                    /*获取输出流并读出到files目录下*/                    File fileCreate = new File(fileName);                    File pFileCreate = fileCreate.getParentFile();//                  System.out.println("fileCreate.getParent(),"+fileCreate.getParent());//                  System.out.println("fileCreate.getPath(),"+fileCreate.getPath());//                  System.out.println("fileCreate.getParentFile(),"+pFileCreate);                    /*                     *  fileCreate.getParent(),d:\files                        fileCreate.getPath(),d:\files\1.jpg                        fileCreate.getParentFile(),d:\files                      */                    //judge the parent path exist,if not ,create it !                    if (!pFileCreate.exists()) {                        pFileCreate.mkdirs();                    }//                  if (!fileCreate.exists()) {//                      fileCreate.createNewFile();//                  }                    OutputStream out = new FileOutputStream(fileCreate);                    /*从输入流读到buffer里面,一次1024个字节*/                    while((len = in.read(buffer))!=-1){                        out.write(buffer,0,len);                    }                    /*关闭输入输出流*/                    out.close();                    in.close();                    //设置编码,避免上传成功出现乱码                    response.setContentType("text/html; charset=utf-8");                     PrintWriter outWriter = response.getWriter();//                  outWriter.print("<script>alert('上传成功');</script>");                    //上传成功后返回到index页面                    outWriter.print("<script>alert('上传成功');window.location.href='index.jsp';</script>");                    outWriter.close();                }            }        } catch (FileUploadException e) {            e.printStackTrace();        }    }}

【2】JSP页面

<form action="uploadServlet" method="post" enctype="multipart/form-data">        File:<input type="file" name="file"/>        Desc:<input type="text" name="desc"/><br><br>        <input type="submit" value="Submit"/>    </form>

【3】result

这里写图片描述

0 0
原创粉丝点击