首页 > 编程语言 >JavaWeb文件上传和下载

JavaWeb文件上传和下载

时间:2023-12-13 11:55:06浏览次数:26  
标签:文件 String System fileName new 上传 下载 JavaWeb

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/

欢迎入群一起讨论

 

 

标签:文件,String,System,fileName,new,上传,下载,JavaWeb
From: https://www.cnblogs.com/songsu/p/17898773.html

相关文章

  • JavaWeb教程
    JavaScriptJS是一门弱类型的语言,变量的数据类型由后面的赋值的类型决定。==是等于,做简单的字面值的比较;===是全等于,除了做字面值的比较外,还会比较两个变量的数据类型。vara="12";varb=12;a==b;//truea===b;//false在JavaScript中,所有的变量都可以作为一个布尔类型的......
  • Nginx-server-文件下载配置
    server{ listen8001; server_namelocalhost; #错误日志:在location块中添加错误日志记录,以便于问题排查。 error_log/var/log/nginx/8001_down_error.log; #通过valid_referers指令来限制允许访问资源的来源。 valid_referersnoneblockedserver_nameslocalh......
  • 国家中小学智慧教育平台教材PDF下载爬虫
    一、确定目标网站二、目标数据分析2.1查看目标数据点击教材后,发现需要登录,如下图。注册登录后查看,同时打开DevTools记录数据包,发现教材PDF下载链接,但无法直接下载,如下图。网上搜索相关话题后发现可通过更改URL绕过该限制,经测试可行,如下图。2.2爬取思路既然找到了实际......
  • js实现上传文件夹功能
    最近在研究上传文件夹功能,并上传到阿里云oss,研究了几天终于实现了。前端代码:添加“webkitdirectory”标签表示支持文件夹上传<inputtype='file'id="inputUploadDir"name="file"webkitdirectory>js代码部分$("#inputUploadDir").change(function(e){letfiles=t......
  • js上传文件夹的功能如何实现
    在JavaScript中无法直接上传整个文件夹,但可以通过以下步骤实现上传文件夹的功能:1.使用``标签来选择文件夹。该标签支持同时选择多个文件和文件夹。2.监听文件夹选择变化的事件,并获取所选择的文件和文件夹。constfileInput=document.querySelector('input[type="file"]');fil......
  • Javascript文件上传
    什么是文件上传文件上传包含两部分,一部分是选择文件,包含所有相关的界面交互。一部分是网络传输,通过一个网络请求,将文件的数据携带过去,传递到服务器中,剩下的,在服务器中如何存储,那就与前端无关了。制作文件上传相关的功能时,一定要先确保文件上传的接口可用,否则之后会遇到无数的麻烦,无......
  • 基于SpringBoot实现文件的上传下载
    (一)概述文件上传下载一直都是一个系统最常用也是最基本的功能点,刚好最近公司的项目上有用到这个功能,于是自己就用SpringBoot也写了一个简化的版本,已实现文件的上传和下载功能。(二)创建项目首先创建一个SpringBoot的项目,接着引入相关的依赖,因为涉及到数据库的操作,所以依赖会比较多一些......
  • 使用SpringBoot实现文件上传和下载
    上传文件:1.在`pom.xml`文件中添加依赖:xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boo......
  • springboot实现文件的上传下载
    SpringBoot提供了简单易用的方式来处理文件上传和下载功能。下面是一个简单的示例:创建一个文件上传的控制器@RestControllerpublicclassFileUploadController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(FileUploadController.class);@PostMappi......
  • Spring Boot中的文件上传和下载实现
    文件上传文件上传是Web应用程序中常见的功能之一,SpringBoot提供了MultipartFile接口来处理文件上传。以下是实现文件上传的步骤:添加依赖在pom.xml文件中添加以下依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</arti......