文件上传

public class upLoadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断上传的文件普通表单还是带文件的表单
        if (!ServletFileUpload.isMultipartContent(req)) {
            return;//终止方法运行,说明这是一个普通的表单,直接返回
        }
        String message = null;
        try {
            //创建上传文件的保存路径,建议在WEB-INF下,安全,用户无法直接访问上传的文件
            String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
            File uploadFile = new File(uploadPath);
            //若地址不存在就创建
            if (!uploadFile.exists()) {
                uploadFile.mkdir();//创建这个目录
            }
            //使用缓存,当文件过大时,先存为临时文件
            String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
            File tempFile = new File(tempPath);
            if (!tempFile.exists()) {
                tempFile.mkdir();
            }

            //先创建DiskFileItemFactory对象;=======================================>>>
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //设置缓存区大小
            diskFileItemFactory.setSizeThreshold(1024 * 1024);
            //临时文件保存目录
            diskFileItemFactory.setRepository(tempFile);

            //获取ServletFileUpload对象============================================>>>
            //作用是处理上传文件数据,将表单的每一项输入封装为Fileltem对象;
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

            //监听文件上传进度;
            servletFileUpload.setProgressListener(new ProgressListener() {
                @Override
                public void update(long l, long l1, int i) {
                    DecimalFormat df = new DecimalFormat("0%");
                    System.out.println("文件总大小==》" + l1 + "已经上传 " + df.format( (((Long) l).intValue()/ ((Long) l1).doubleValue())));
                }
            });

            //处理文件乱码
            servletFileUpload.setHeaderEncoding("utf-8");
            //设置单个文件最大值3M
            servletFileUpload.setFileSizeMax(3 * 1024 * 1024);
            //设置总大小
            servletFileUpload.setSizeMax(100 * 1024 * 1024);

            //处理上传的文件;============================================>>>
            //前端请求解析; 封装为fileItem对象
            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
                //判断是输入框还是上传文件的;
                //注意这个方法: 当返回 false 时才是文件类型的;
                if (fileItem.isFormField()) {
                    //获取其他标签框的name;
                    String name = fileItem.getName();
                    //处理乱码问题;(统一编码)
                    String value = fileItem.getString("utf-8");
                    System.out.println(name + "<---->" + value);
                } else {
                    // 获取文件名
                    String uploadName = fileItem.getName();
                    System.out.println("注意上传的文件名");

                    if (uploadName == null || uploadName.trim().equals("")) {
                        continue;
                    }

                    //输入文件的名字;与后缀名;
                    String realName = uploadName.substring(uploadName.lastIndexOf("/" )+ 1);
                    String nameSuffx = uploadName.substring(uploadName.lastIndexOf("." )+ 1);

                    System.out.println("实际文件名==>" + realName + "后缀文件类型=>" + nameSuffx);

                    String uploadFileId = UUID.randomUUID().toString();
                    //文件的存放地址问题============================================>>>
                    //文件真实地址加上uuid的通用码;
                    String realPath = uploadPath + "/" + uploadFileId;
                    File realFile = new File(realPath);
                    if (!realFile.exists()) {
                        //创建目录;
                        realFile.mkdir();
                    }
                    //文件传输==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>流的方式;
                    InputStream inputStream = fileItem.getInputStream();
                    FileOutputStream out = new FileOutputStream(realPath + "/" + realName);
                    //创建传输的缓冲区;
                    byte[] arr = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(arr)) > 0) {
                        out.write(arr, 0, len);
                    }

                    out.close();
                    inputStream.close();
                    message = "上传成功";
                }
            }
        } catch (FileUploadException e) {
            message = "上传失败";
            e.printStackTrace();
        }
        req.setAttribute("message", message);
        req.getRequestDispatcher("result.jsp").forward(req, resp);
    }

}

  

posted @ 2022-03-25 21:42  每天--自然醒  阅读(21)  评论(0)    收藏  举报