文件上传下载
文件上传
用户访问当前系统,将自己本地计算机中文件通过浏览器上传到当前系统所在的服务器过程中称之为文件的上传
文件上传: 用户将自己计算机中文件 上传到 项目所在服务器过程、文件服务器、OSS 称之为文件上传
这里只记录了上传至本地服务器的笔记
准备上传页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="http://localhost:8888/file/uploadByJarDeploy" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
<!--
1. 表单提交方式必须是post
2. 表单的enctype属性必须为multipart/form-data
3. 后台接受变量名字要与文件选择name属性一致
-->
编写控制器
@Controller
@RequestMapping("file")
public class FileUploadController {
private static final Logger log = LoggerFactory.getLogger(FileUploadController.class);
@Value("${file.upload.dir}")
private String realPath;
/**
* 第二种文件上传
* 注意: 这种方式适用于任何一种部署方式 推荐使用这种方式
* @param file
* @return
* @throws IOException
*/
@RequestMapping("uploadByJarDeploy")
public String uploadByJarDeploy(MultipartFile file) throws IOException {
//文件名
String originalFilename = file.getOriginalFilename();
log.debug("文件名: {}", originalFilename);
log.debug("文件大小: {}", file.getSize());
log.debug("文件类型: {}", file.getContentType());
//改名
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;
//上传文件到哪
file.transferTo(new File(realPath,newFileName));
return "redirect:/upload.html";
}
/**
* 用来测试文件上传 - 这种方式:不能用于jar包部署
* 注意:这种方式存在局限性,不推荐在使用这种方式进行文件上传了
* @return
*/
@RequestMapping("upload")
public String upload(MultipartFile file, HttpServletRequest request) throws IOException {//定义:接收文件对象 multipartFile file变量名要与form中input type="file"标签name属性名一致
//文件名
String originalFilename = file.getOriginalFilename();
log.debug("文件名: {}", originalFilename);
log.debug("文件大小: {}", file.getSize());
log.debug("文件类型: {}", file.getContentType());
//1.根据相对 上传 "upload" 获取绝对路径(真实路径) /users/桌面.... 服务器: /home/springboot_day4..
String realPath = request.getSession().getServletContext().getRealPath("/upload");
log.debug("获取绝对路径: {}", realPath);
//2.上传文件 参数1: 将文件写入到那个目录 aa.txt .md xxx.xxx.xxx.md
//修改文件名
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;
file.transferTo(new File(realPath, newFileName));
return "redirect:/upload.jsp";
}
}
修改文件上传大小
#上传时出现如下异常: 上传文件的大小超出默认配置 默认10M
nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (38443713) exceeds the configured maximum (10485760)
#修改上传文件大小:
spring:
http:
multipart:
max-request-size: 100MB # 最大请求大小
max-file-size: 100MB # 最大文件大小
文件下载
文件下载: 将服务器某个资源文件下载到用户本地计算机过程称之为文件下载
提供下载文件链接
<a href="../file/download?fileName=corejava.txt">corejava.txt</a>
开发控制器
@Controller
@RequestMapping("file")
public class FileDownloadController {
@Value("${file.download.dir}")
private String realPath;
/**
* 文件下载
* @param fileName
*/
@RequestMapping("download")
public void download(String fileName, HttpServletResponse response) throws IOException {
//1.去指定目录中读取文件
File file = new File(realPath, fileName);
//2.将文件读取为文件输入流
FileInputStream is = new FileInputStream(file);
//2.5 获取响应流之前 一定要设置以附件形式下载 attachment:附件
//URLEncoder.encode(fileName,"UTF-8")可以解决中文乱码问题
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//3.获取响应输出流
ServletOutputStream os = response.getOutputStream();
//4.输入流复制给输出流
/*int len=0;
byte[] b = new byte[1024];
while(true){
len = is.read(b);
if(len==-1)break;
os.write(b,0,len);
}*/
//FileCopyUtils是spring官方提供的工具类,功能等同上面被注释的代码
FileCopyUtils.copy(is,os);
}
}