JavaWeb文件上传和下载

JavaWeb文件上传和下载 (含文件上传重名覆盖解决方案)

  • JavaWeb文件上传和下载 (含文件上传重名覆盖解决方案)
  • 1 文件上传
    • 1.1 步骤
    • 1.2 防止文件同名被覆盖
    • 1.3 练习
  • 2 文件下载
    • 2.1 步骤
    • 2.2 练习
  • 3 springMVC的文件上传与下载

JavaWeb文件上传和下载 (含文件上传重名覆盖解决方案)

快速回忆,快就完了(哈哈)。我们这里借助的是:

  • commons-fileupload-1.2.1.jar
  • commons-io.jar

1 文件上传

1.1 步骤

0、前端页面的from表单设置 enctype=“multipart/form-data” method=“post”

1、首先判断是不文件表单

2、创建servletFileUpload对象,设置编码(解决文件名乱码)

3、获取表单项集合

4、判断每个表单项是不是文件

5、创建存放文件的目录(根据自己需求来)

6、获取文件名,(为了防止重名可按需求改)

7、拷贝

1.2 防止文件同名被覆盖

从韩老师哪里学的 老韩,嘻嘻

JavaWeb文件上传和下载_第1张图片
为了防止不同的文件拥有相同的文件名上传,导致文件被覆盖,最后只留下一个。

采取两个措施:

(1)在存放上传文件的目录,为年月日分别创建文件夹。按上传时间,将文件放在不同文件夹

(2)可以在文件名的前面生成随机字符串,进一步避免重名风险。(也就是步骤六)

一个返回“年/月/日/" 字符串的代码 后面有用到

public class WebUtils {

    public static String getYearMonthDay() {
        //如何得到当前的日期-> java基础 日期 三代类
        LocalDateTime ldt = LocalDateTime.now();
        int year = ldt.getYear();
        int monthValue = ldt.getMonthValue();
        int dayOfMonth = ldt.getDayOfMonth();
        String yearMonthDay = year + "/" + monthValue + "/" + dayOfMonth + "/";
        return yearMonthDay;
    }
   
}

1.3 练习

//1、首先判断是不文件表单
if (ServletFileUpload.isMultipartContent(req)) { //含文件
//2、创建servletFileUpload对象,设置编码(解决文件名乱码)
    DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
    ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
    servletFileUpload.setHeaderEncoding("utf-8");
    try {
//3、获取表单项集合
        List<FileItem> fileItems = servletFileUpload.parseRequest(req);
        for (FileItem fileItem : fileItems) {
//4、判断每个表单项是不是文件
            if (fileItem.isFormField()) { //文本
                String name = fileItem.getString("utf-8");
                System.out.println("传输的文本是:" + name);
            } else { //文件
//5、创建存放文件的目录(根据自己需求来)
                //存放上传文件的根文件夹
                String upFileRootDir = this.getServletContext().getRealPath("/upFile/");
                File fileRealPathDir = new File(upFileRootDir + WebUtils.getYearMonthDay());
                if (!fileRealPathDir.exists()) {
                    fileRealPathDir.mkdirs();
                    System.out.println("创建文件夹:" + fileRealPathDir);
                }
//6、获取文件名,(为了防止重名可按需求改)
                //UUID.randomUUID() 生成随机字串
                //UUID.randomUUID()和System.currentTimeMillis() 防止重名
                String fileName = UUID.randomUUID() + "_" + System.currentTimeMillis() + "_" + fileItem.getName();
                fileItem.write(new File(fileRealPathDir, fileName));
//7、拷贝
                System.out.println("文件传输成功");
                resp.setContentType("text/html;charset=utf-8");
                resp.getWriter().write("上传成功~");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
} else {
    System.out.println("不含文件...");
}

2 文件下载

2.1 步骤

1、获取下载的文件名

2、获取要下载的文件MIME的类型,设置相应头Content-Type

3、设置数据的展示形式 , 设置相应头Content-Disposition,如果attachment 则使用文件下载方式。(设置时注意:不同浏览器编码不一致)

4、获取输入、输出流、进行拷贝。

2.2 练习

//1、获取下载的文件名
req.setCharacterEncoding("utf-8");
ServletContext servletContext = this.getServletContext();
//2、获取要下载的文件MIME的类型,设置相应头Content-Type。
String downloadPath = "/fileUpDown/downLoad/";
String fileName = req.getParameter("fileName");
String fileFullPath = downloadPath + fileName;
String mimeType = servletContext.getMimeType(fileFullPath);
resp.setContentType(mimeType);
//3、设置数据的展示形式 , 设置相应头Content-Disposition,如果attachment 则使用文件下载方式。
if (req.getHeader("User-Agent").contains("Firefox")) {
    // 火狐 Base64编码
    resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
            new BASE64Encoder().encode(fileName.getBytes("UTF-8")) + "?=");
} else {
    // 其他(主流ie/chrome)使用URL编码操作
    resp.setHeader("Content-Disposition", "attachment; filename=" +
            URLEncoder.encode(fileName, "UTF-8"));
}
//4、获取输入、输出流、进行拷贝。
InputStream resourceAsStream = servletContext.getResourceAsStream(fileFullPath);
IOUtils.copy(resourceAsStream, resp.getOutputStream());

3 springMVC的文件上传与下载

 	@RequestMapping("/up")
    public String up(@RequestParam(value = "file")MultipartFile file, HttpServletRequest request) throws IOException {
        String realPath = request.getServletContext().getRealPath("/img/" + file.getOriginalFilename());
        System.out.println("hhh = " + realPath);
        File saveToFile = new File(realPath);
        file.transferTo(saveToFile);
        return "success";
    }

    @RequestMapping("/down/{fileName}")
    public ResponseEntity<byte[]> down(HttpSession session, @PathVariable(name = "fileName") String fileName) throws Exception {
        InputStream is = session.getServletContext().getResourceAsStream("/img/" + fileName);
        byte[] bytes = new byte[is.available()];
        is.read(bytes);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Content-Disposition","attachment;filename="+fileName);
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
        return responseEntity;
    }

你可能感兴趣的:(复习之旅,java,开发语言)