JavaWeb文件上传和下载

发布时间 2023-12-13 11:55:30作者: Xproer-松鼠

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%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%92%8c%e4%b8%8b%e8%bd%bd/

欢迎入群一起讨论