JavaWeb文件上传和下载
  9m65el8SCpbP 2023年12月19日 12 0

JavaWeb文件上传和下载 (含文件上传重名覆盖解决方案)
快速回忆,快就完了(哈哈)。我们这里借助的是:

commons-fileupload-1.2.1.jar
commons-io.jar
1 文件上传
1.1 步骤
0、前端页面的from表单设置 enctype=“multipart/form-data” method=“post”

<form action="fileUpDown/FileUpServlet" method="post" enctype="multipart/form-data">

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

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

3、获取表单项集合

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

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

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

7、拷贝

1.2 防止文件同名被覆盖

为了防止不同的文件拥有相同的文件名上传,导致文件被覆盖,最后只留下一个。

采取两个措施:

(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;
    }

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/13/javaweb文件上传和下载/


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月19日 0

暂无评论

推荐阅读
9m65el8SCpbP