commons-fileupload实现文件按日期进行存储带缓存

JSP

 1 <%--
 2   Created by IntelliJ IDEA.
 3   User: Ghh
 4   Date: 2019/9/1
 5   Time: 14:27
 6   To change this template use File | Settings | File Templates.
 7 --%>
 8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 9 <html>
10   <head>
11     <title>文件上传</title>
12   </head>
13   <body>
14   <form action="${pageContext.request.contextPath}/uploadServlet" method="post" enctype="multipart/form-data">
15     <input type="file" name="image" id="image"><br>
16     <input type="submit" value="上传">
17   </form>
18   </body>
19 </html>

Servlet

package com.ghh.upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.List;
import java.util.UUID;

/**
 * @author Ghh
 * @date 2019/9/1 14:32
 * @Description
 */
@WebServlet(name = "UploadServlet",urlPatterns = {"/uploadServlet"})
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        InputStream is = null;
        FileOutputStream fileOutputStream = null;

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(!isMultipart){
            throw new RuntimeException("该请求不支持文件上传");
        }
        DiskFileItemFactory itemFactory = new DiskFileItemFactory();
        //设置上传文件大于3M会启动临时文件目录
        itemFactory.setSizeThreshold(1024*1024*3);
        //指定临时文件存储目录
        String tempPath = this.getServletContext().getRealPath("/temp");
        System.out.println("tempPath = " + tempPath);
        File temp = new File(tempPath);
        if(!temp.exists()){
            temp.mkdirs();
        }
        itemFactory.setRepository(temp);
        ServletFileUpload servletFileUpload = new ServletFileUpload(itemFactory);
        try {
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                if(fileItem.isFormField()){
                    //普通字段
                    String fieldName = fileItem.getFieldName();
                    String fileValue = fileItem.getString("UTF-8");
                    System.out.println(fieldName+"===="+fileValue);
                }else{
                    String fileName = fileItem.getName();
                    String suffer = fileName.substring(fileName.lastIndexOf("."));
                    UUID uuid = UUID.randomUUID();
                    fileName = uuid+suffer;
                    System.out.println("fileName = " + fileName);
                    //获取输入流
                    is = fileItem.getInputStream();
                    //创建输出流
                    String path = this.getServletContext().getRealPath("/upload");
                    //根据年月日创建多级目录
                    LocalDate now = LocalDate.now();
                    int year = now.getYear();
                    int month = now.getMonthValue();
                    int day = now.getDayOfMonth();
                    path = path+File.separator+year+File.separator+month+File.separator+day;
                    System.out.println("path = " + path);
                    //创建父目录
                    File parentDir = new File(path);
                    if(!parentDir.exists()){
                        parentDir.mkdirs();
                    }
                    File file = new File(path,fileName);
                    fileOutputStream = new FileOutputStream(file);
                    byte[] bytes = new byte[1024];
                    int len = -1;
                    while ((len = is.read(bytes))!=-1){
                        fileOutputStream.write(bytes,0,len);
                    }
                    fileItem.delete();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }finally {
            try {
                is.close();
                fileOutputStream.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }
}

  

 

posted @ 2019-09-01 15:19  演绎、白色舞步  阅读(277)  评论(0编辑  收藏  举报