Servlet实现文件上传 2种上传方式@ MultipartConfig

今天咱们来聊一聊Servlet3.0的文件上传,3.0JAVA源生支持文件上传。
文件上传,我们需要在表单或HTTPURLConnection中设置请求方式为POST并且还需要设置消息头enctype=”multipart/form-data”(作用是将文件对应的内容以二进制的形式传递给后台)

1、上传页面

下面看看我的上传的HTML页面:


<html>
<head>
<meta charset="UTF-8">
<title>文件上传,支持图片的预览,多个图片上传等功能title>
<script type="text/javascript">
var no=1;
//要显示图片的img的id必须showimg开头
    //预览上传的图片
  function preview(obj,id){
      //判断是否支持FileReader
      if (window.FileReader) {
          var reader = new FileReader();
      } else {
          alert("您的设备不支持图片预览功能,如需该功能请升级您的设备!");
      }

      //获取文件
      var file = obj.files[0];
      var imageType = /^image\//;
      //是否是图片
      if (!imageType.test(file.type)) {
          alert("请选择图片!");
          //return;
      }
      //读取完成
      reader.onload = function(e) {
          //获取图片dom
          var img = document.getElementById("previewImg"+id);
          //图片路径设置为读取的图片
          img.src = e.target.result;
      };
      reader.readAsDataURL(file);
  }
  //新增file标签
  function addFile(dv_id) {
        no++;
        //var d=document.getElementById("dv_files");
        var d=document.getElementById(dv_id);
        var c=document.createElement("input");
        c.setAttribute("type","file");
        c.setAttribute("name","fn"+no);
        c.setAttribute("onchange","preview(this,"+no+")");
        d.appendChild(c);
        var img=document.createElement("img");
        img.setAttribute("id","previewImg"+no);
        d.appendChild(img);
        var b=document.createElement("br");
        d.appendChild(b);
    }
script>
<style type="text/css">
img{
width:200px;
height:200px;
}
style>
head>
<body>

<div>
<form action="NewFileUpServlet" method="post" enctype="multipart/form-data">
<input type="file" name="fn" onchange="preview(this,1)" /><img id="previewImg1"/>
<br/>
<div id="dv_files">

div>

<input type="button" value="继续添加" onclick="addFile('dv_files')"/><br/>
<input type="submit" value="上传"/>


form>
div>
body>
html>

我这个页面使用的是HTML5,支持图片的预览功能,还可以上传多张图片。

2、Servlet通过 @MultipartConfig实现文件上传

然后看下我的Servlet,通过使用@MultipartConfig来完成文件的上传


/**
 * Servlet implementation class NewFileUpServlet Servlet3.0之后可以使用注解实现文件的上传
 */
@WebServlet("/NewFileUpServlet")
@MultipartConfig
public class NewFileUpServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public NewFileUpServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取request的所有的请求参数(将请求参数转换为Part)
        Collection list = request.getParts();
        for (Part p : list) {
            // 获取上传的文件名称
            String filename = p.getSubmittedFileName();
            // 创建要保存的文件对象
            File file = new File(createDir(getServletContext()), createName(filename));
            // 保存文件
            p.write(file.getAbsolutePath());
        }
    }

    // 创建目录---以日期,一天一个文件夹
    private File createDir(ServletContext context) {
        String p1 = context.getRealPath("/files");
        File file = new File(p1, new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()));
        if (!file.exists()) {
            file.mkdirs();
        }
        return file;
    }

    // 创建文件名--区分同名文件,在文件名前加上当前的时间
    private String createName(String name) {
        return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime()) + "_" + name;
    }

}

为了防止文件名相同我在接受的文件名前面加上当前时间,这个时间精确到毫秒。也为了日后文件会越来越多,我就每天创建一个文件夹用来记录每天的上传的文件。以上就是使用Servlet3.0的注解来完成的文件上传,不需要任何的jar包支持,而且还非常的方便。
这是需要JDK1.8、Dynamic Web Module 3.0才可以使用。如果版本较低那么只能使用下面的Apache的jar包,也是现在SpringMVC中支持的文件上传。

3、Apache的文件上传


/**
 * Servlet implementation class FileUpServlet
 * 实现文件的上传
 */
@WebServlet("/FileUpServlet")
public class FileUpServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileUpServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、验证是否为文件上传
        if(ServletFileUpload.isMultipartContent(request)){
            //2、创建工厂类
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //3、设置临时文件目录
            factory.setRepository(new File("F:/Case/fileUptemp"));
            //4、创建文件上传类对象
            ServletFileUpload sfu=new ServletFileUpload(factory);
            //5、设置大小
            sfu.setFileSizeMax(10*1024*1024);//设置单个文件大小不超过10M
            sfu.setSizeMax(100*1024*1024);//设置上传的总大小不超过100M
            try {
                //6、获取请求参数的所有参数信息
                List list = sfu.parseRequest(request);
                //7、遍历集合,将file标签的内容保存
                for(FileItem fi:list){
                    if(!fi.isFormField())//验证是否是file标签
                    {
                        //创建要保存图片的File对象
                        File file=new File(createDir(getServletContext()),createName(fi.getName()));
                        //输出图片的绝对路径
                        System.out.println(file.getAbsolutePath());
                        //将上传的图片写出到指定路径
                        fi.write(file);
                    }
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //创建目录---以日期,一天一个文件夹
    private File createDir(ServletContext context) {
        String p1=context.getRealPath("/files");
        File file=new File(p1,new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()));
        if(!file.exists()){
            file.mkdirs();
        }
        return file;
    }
    //创建文件名--区分同名文件,在文件名前加上当前的时间
    private String createName(String name) {
        return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime())+"_"+name;
    }
}

这里需要jar的支持,Apache文件上传jar包
在学习中有任何问题都欢迎留言交流。

你可能感兴趣的:(JAVA那些代码,Java笔记,servlet,java,文件上传,Multipart)