浅谈ServletFileUpload

最近公司需要上传Excel文件至服务器,并从文件中读取数据后封装Bean入库,以下是整理出来的经验:
一:所需的Jar
在这里插入图片描述

package com.zhuling.servlet;

import com.zhuling.tools.FileTools;
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;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 测试所用的Servlet
 * @author Juling
 * @date October 17th.
 */
public class FileUploadServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        // 判断是否支持文件上传
        if (!ServletFileUpload.isMultipartContent(request)) {
            Map<String, String[]> map = FileTools.getFormField(request);
            for (Map.Entry<String, String[]> entry : map.entrySet()) {
                System.out.println("key=" + entry.getKey());
                String[] strs = entry.getValue();
                for (String str : strs) {
                    System.out.println(new String(str.getBytes("utf-8"), "utf-8"));
                }
            }
        } else {
            try {
                // 创建一个DiskFileItemfactory工厂类
                DiskFileItemFactory factory = new DiskFileItemFactory();
//                factory.setRepository(new File("f:\\"));// 指定临时文件的存储目录
                // 创建一个ServletFileUpload核心对象
                ServletFileUpload fileUpload = new ServletFileUpload(factory);
                // 解决上传表单项乱码问题
                fileUpload.setHeaderEncoding("UTF-8");
                // 限制上传文件的大小 3M
                fileUpload.setFileSizeMax(1024 * 1024 * 3);
                fileUpload.setSizeMax(1024 * 1024 * 6);
                List<FileItem> data = fileUpload.parseRequest(request);
                // 遍历表单数据
                for (FileItem fileItem : data) {
                    // 普通表单项
                    if (fileItem.isFormField()) {
                        System.out.println("key=" + fileItem.getFieldName() + ",value=" + fileItem.getString("UTF-8"));
                    } else {
                        // 文件上传项
                        String savePath = request.getSession().getServletContext().getRealPath(File.separator + "WEB-INF" + File.separator + "excel");
                        // 文件上传
                        FileTools.processUploadField(fileItem, savePath);
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }
    }
}

文件上传类

package com.zhuling.tools;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.FilenameUtils;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

/**
 * 实现文件上传
 * @author Juling 
 * @date October 17th.
 */
public class FileTools {
    /**
     * 获取普通表单字段
     *
     * @param request
     * @return
     */
    public static Map<String, String[]> getFormField(HttpServletRequest request) {
        return request.getParameterMap();
    }

    /**
     * 文件上传
     *
     * @param fileItem
     * @param savePath
     */
    public static void processUploadField(FileItem fileItem, String savePath) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = fileItem.getInputStream();
            // 对savePath进行进一步处理 按每天的日期存放至一个文件夹方便管理
            savePath = savePath + File.separator + new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());
            File file = new File(savePath);
            // 如果文件夹不存在或者已存在但不是一个文件夹
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }
            String fileName = fileItem.getName();
            if (!(fileName.length() == 0 || fileName.trim().equals(""))) {
                // 考虑到不同浏览器下对获取文件名的结果不同,对文件名进一步进行处理
                // fileName.substring(fileName.lastIndexOf(File.separator) + 1);
                fileName = FilenameUtils.getName(fileName); // 效果同上
            }
            // 解决文件名同名问题
            String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
            StringBuilder stringBuilder = new StringBuilder(savePath);
            String filePath = stringBuilder.append(File.separator).append(fileName).insert(stringBuilder.lastIndexOf("."),timeStamp).toString();
            outputStream = new FileOutputStream(filePath);
            byte[] arr = new byte[1024 * 8];
            int len;
            while ((len = inputStream.read(arr)) != -1) {
                outputStream.write(arr, 0, len);
                outputStream.flush();
            }
            // 上传文件 自动删除临时文件
            fileItem.delete();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) inputStream.close();
                if (outputStream != null) outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

测试结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值