java实现文件上传的简单的demo

2019-03-31  本文已影响0人  邪恶的正派

最近公司做项目,发现他们写的上传的servlet,比我平时写的貌似要高级点。记录一下,作为笔记。希望分享给大家,也能有点用。或许这些代码网上都有。
具体代码如下:

package com.sunsheen.common.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sunsheen.jfids.commons.fileupload.FileItem;
import com.sunsheen.jfids.commons.fileupload.FileUploadException;
import com.sunsheen.jfids.commons.fileupload.disk.DiskFileItemFactory;
import com.sunsheen.jfids.commons.fileupload.servlet.ServletFileUpload;
import com.sunsheen.jfids.gson.Gson;
import com.sunsheen.jfids.system.config.Configs;
import com.sunsheen.jfids.system.servlet.Servlet;

public class FileUploadServlet extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException  {
        // modify by tyhuic at 20181126,增加request转码
        req.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 服务器存储文件名的规则类型 1:按原文件名存储,2:原文件名+时间戳,3:完全随机16位
        String mode = req.getParameter("saveType");
        String filePathConfig = req.getParameter("filePath");
        // 得到上传文件的保存目录。 将上传的文件存放于WEB-INF目录下,不允许外界直 接访问,保证上传文件的安全
        String realPath = Configs.get(filePathConfig);
        System.out.println("文件存放位置:" + realPath);
        // 设置临时目录。 上传文件大于缓冲区则先放于临时目录中
        String tempPath = realPath + File.separator + "temp";
        //System.out.println("临时文件存放位置:" + tempPath);

        // 判断存放上传文件的目录是否存在(不存在则创建)
        File f = new File(realPath);
        if (!f.exists() && !f.isDirectory()) {
            //System.out.println("目录或文件不存在! 创建目标目录。");
            f.mkdirs();
        }
        // 判断临时目录是否存在(不存在则创建)
        File f1 = new File(tempPath);
        if (!f1.isDirectory()) {
            //System.out.println("临时文件目录不存在! 创建临时文件目录");
            f1.mkdirs();
        }

        /**
         * 使用Apache文件上传组件处理文件上传步骤:
         * 
         * */
        // 1、设置环境:创建一个DiskFileItemFactory工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置上传文件的临时目录
        factory.setRepository(f1);

        // 2、核心操作类:创建一个文件上传解析器。
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解决上传"文件名"的中文乱码
        upload.setHeaderEncoding("UTF-8");

        // 3、判断enctype:判断提交上来的数据是否是上传表单的数据
        if (!ServletFileUpload.isMultipartContent(req)) {
            //System.out.println("不是上传文件,终止");
            // 按照传统方式获取数据
            return;
        }

        // ==获取输入项==
        // //限制单个上传文件大小(5M)
        // upload.setFileSizeMax(1024*1024*4);
        // //限制总上传文件大小(10M)
        // upload.setSizeMax(1024*1024*6);

        // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
        Map<String, Object> msg = new HashMap<String, Object>();
        InputStream in = null;
        OutputStream out = null;
        Gson gson = new Gson();
        List<FileItem> items = null;
        try {
            items = upload.parseRequest(req);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        for (FileItem item : items) {
            // 如果fileitem中封装的是普通输入项的数据(输出名、值)
            if (item.isFormField()) {
                String filedName = item.getFieldName();// 普通输入项数据的名
                // 解决普通输入项的数据的中文乱码问题
                String filedValue = item.getString("UTF-8");// 普通输入项的值
                System.out.println("普通字段:" + filedName + "==" + filedValue);
            } else {
                // 如果fileitem中封装的是上传文件,得到上传的文件名称,
                String fileName = item.getName();// 上传文件的名
                // 多个文件上传输入框有空 的 异常处理
                if (fileName == null || "".equals(fileName.trim())) { // 去空格是否为空
                    continue;// 为空,跳过当次循环, 第一个没输入则跳过可以继续输入第二个
                }

                // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
                // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
                // 处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
                fileName = fileName.substring(fileName
                        .lastIndexOf(File.separator) + 1);
                // 拼接上传路径。存放路径+上传的文件名
                String serverName = "";
                String filePrefix = fileName.substring(0,
                        fileName.indexOf("."));
                String fileSuffix = fileName.substring(fileName
                        .indexOf("."));
                switch (mode) {
                case "1":
                    serverName = fileName;
                    break;
                case "2":
                    serverName = filePrefix
                            + "_"
                            + new SimpleDateFormat("yyyyMMddHHmmss")
                                    .format(new Date()) + fileSuffix;
                    break;
                case "3":
                    serverName = UUID.randomUUID().toString()
                            .replace("-", "").substring(16)
                            + fileSuffix;
                    break;
                default:
                    break;
                }
                // 构建输入输出流
                in = item.getInputStream(); // 获取item中的上传文件的输入流
                // modify by tyhuic at 20181126,修改此处文件存放路径
                out = new FileOutputStream(realPath + File.separator
                        + serverName); // 创建一个文件输出流

                // 创建一个缓冲区
                byte b[] = new byte[1024];
                // 判断输入流中的数据是否已经读完的标识
                int len = -1;
                // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
                while ((len = in.read(b)) != -1) { // 没数据了返回-1
                    // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
                    out.write(b, 0, len);
                }
                // modify by tyhuic at 20181126,增加服务器上传完成文件路径的回显
                msg.put("serverpath", realPath + File.separator
                        + serverName);

                msg.put("servername", serverName);
                msg.put("localname", fileName);
                msg.put("message", "文件上传成功!");
                msg.put("code", "1");
                response.getWriter().write(gson.toJson(msg));
                item.delete();// 删除处理文件上传时生成的临时文件
                System.out.println("文件上传成功");
            }
        }
        if (in != null) {
            in.close();
        }
        if (out != null) {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

其中,Configs.get(filePathConfig);是获取的文件的上传路径。这个是一个配置文件,待我下次弄清楚后,再写上来。目前用的时候,可以直接写成你需要的路径就好。

上一篇 下一篇

猜你喜欢

热点阅读