SpringBoot 文件的上传、下载
目录
- 文件上传
- yml
- html 表单
- controller
- 说明
- 文件下载
- 说明
文件上传
spring-boot-starter-web中已经包含了springmvc的依赖,其中包括上传文件所需的依赖,不需要额外添加依赖。
yml
spring:
servlet:
multipart:
#上传文件的最大体积,默认1MB
max-file-size: 20MB
#请求的最大体积,默认10M
max-request-size: 20MB
#上传文件的保存位置
location: D:/mall/upload
html 表单
<form action="/upload" method="post" enctype="multipart/form-data">
选择文件:<input name="uploadFile" type="file" multiple /><br />
<button type="submit">上传</button>
</form>
multiple用于多选,不指定multiple默认只能选择一个文件
controller
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
@RestController
public class FileUploadController {
@Value("${spring.servlet.multipart.location}")
private static String saveDir;
//如果指定的保存目录不存在,则自动创建
static {
File dir = new File(saveDir);
if (!dir.exists()) {
dir.mkdirs();
}
}
/** * 处理上传文件 * * @param fileList 一个 MultipartFile 封装1个文件,单文件上传用 MultipartFile,多文件用 List<MultipartFile> * @return 处理结果。通常会使用自定义的响应来封装,根据场景确定是否需要返回文件链接 */
@PostMapping("/upload")
public String upload(@RequestParam("uploadFile") List<MultipartFile> fileList) {
//检测用户是否上传了文件,有可能用户只是点击了提交按钮,但并未选择文件
if (!fileList.get(0).isEmpty()) {
// 处理上传文件
for (MultipartFile file : fileList) {
//原文件名。getContentType() 是文件类型,eg. text/plain
String originalFilename = file.getOriginalFilename();
//文件扩展名
String extensionName = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用uuid生成新文件名,防止重名
String newFilename = UUID.randomUUID() + extensionName;
//将临时文件保存至指定目录
try {
file.transferTo(new File(saveDir + "/xxx/" + newFilename));
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
return "未选择文件,请先选择文件";
}
}
说明
判断用户是否上传了文件,不能用List
因为List
判断MultipartFile是否为空,不能用==null来判断,因为不管有没有上传文件,MultipartFile一定!=null,判断用户是否上传了文件,要用MultipartFile提供的isEmpty()来判断。
文件下载
yml
#自定义配置,下载文件的根目录
download-dir: D:/download
controller
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@Controller
public class FileDownloadController{
@Value("${download-dir}") //注入application中配置的下载文件根目录
private String filePath;
@RequestMapping("/download/{filename}")
@ResponseBody
public String downLoad(@PathVariable String filename, HttpServletResponse response) throws UnsupportedEncodingException {
File file = new File(filePath + "/" + filename);
System.out.println(filePath+"/"+filename);
//判断文件是否存在,其实不用判断,因为不存在也设置了对应的异常处理
if (file.exists()) { //文件存在
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(filename, "UTF-8")); //设置下载文件名,解决文件名中文乱码
byte[] buffer = new byte[1024];
FileInputStream fis = null; //输入流
BufferedInputStream bis = null;
OutputStream os = null; //输出流
try {
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int length;
while ((length=bis.read(buffer)) != -1) {
os.write(buffer,0,length);
}
fis.close();
bis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
return "文件不存在!";
} catch (IOException e) {
e.printStackTrace();
return "下载失败!";
}
return null; //下载成功
}
return "文件不存在";
}
}
<a href="/download/hehua.jpg">下载图片</a>
href中不要带中文
说明
- 处理上传文件时,通常要往数据库中插入一条记录,记录文件原名、保存路径(uuid文件名,不要带中文)、文件类型、体积、上传时间、上传人
- 下载文件时,前端给的链接不要带中文,链接可以给保存路径(uuid文件名)、数据库记录的id,后台取出参数,查询数据库得到文件原名及其它信息,设置下载文件名
还没有评论,来说两句吧...