美文网首页
java实现文件上传的简单的demo

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

作者: 邪恶的正派 | 来源:发表于2019-03-31 21:44 被阅读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);是获取的文件的上传路径。这个是一个配置文件,待我下次弄清楚后,再写上来。目前用的时候,可以直接写成你需要的路径就好。

    相关文章

      网友评论

          本文标题:java实现文件上传的简单的demo

          本文链接:https://www.haomeiwen.com/subject/ajtpbqtx.html