文件上传模块:
首先,需要设置一个存放上传文件的目录,可以在接口中指定,也可以在配置文件中提前设置好。
这边采用的是配置文件的形式,在application.properties中指定路径为static下的files文件夹
#存放上传文件的目录
fileLocation=static/files
#请求下载文件的源目录
fileDownload=static/downLoad
然后,通过@Value注解的方式拿到该目录的值,注入到自定义的变量中
@Value("${fileLocation}")
private String fileLocate;
@Value("${fileDownload}")
private String FileDownLoad;
其次,通过拼接的方式获取该目录的绝对路径,将此路径转换为抽象路径名来创建一个File实例(这里的file并非是真实的文件,下图为官方的解释)。
然后,判断该路径是否存在,若不存在则需要生成该目录
最后,将前端传来的文件保存在该目录下,整个上传功能到此就结束了。
上传模块的完整代码如下(不要忘记存放目录路径的配置):
@PostMapping("/upload")
public void FileUpload(MultipartFile file, HttpServletRequest request) throws IOException
{
//获取存放上传文件的绝对路径
String realPath = ResourceUtils.getURL("classpath:").getPath()+fileLocate;
//创建一个file对象
File newFile = new File(realPath);
//测试此路径是否存在,若不存放则生成该路径
if(!newFile.exists())
newFile.mkdirs();
//在指定目录下生成该文件
file.transferTo(new File(newFile,file.getOriginalFilename()));
}
成功上传的图片会出现在target.classes.static.files目录下,如下图(target目录需要编译后才会生成)
另外,在application.properties文件里也可以对上传文件的大小进行配置,如下文件上传模块
#设置总共上传的文件大小
spring.servlet.multipart.max-request-size=10MB
#设置单个上传文件的大小
spring.servlet.multipart.max-file-size=5MB
文件下载模块:
首先,需要有一个存放下载文件的目录,在static下新建一个download目录,放入要测试的文件
然后,设置响应头,告诉前端要以附件的形式打开该文件
其次,获取文件的输入流,创建文件的输出流对象,通过缓冲区的方式从输入流中读入数据,再写到输出流中,知道缓冲区不再有数据。
最后,先关闭输出流,再关闭输入流。
注意:当请求下载的文件是中文名称时,需要对文件名的编码转为utf-8格式,不然后端接受的文件名是乱码,导致无法成功下载。
下载模块的完整代码如下(下载文件路径的配置如上):
@GetMapping("/download/{fileName}")
public void FileDownload(@PathVariable String fileName, HttpServletResponse response) throws IOException
{
//获得待下载文件的绝对路径
String realPath = ResourceUtils.getURL("classpath:").getPath()+FileDownLoad;
//获取文件输入流
FileInputStream fileInputStream = new FileInputStream(new File(realPath,fileName));
//设置响应头、以附件形式打开文件
//response.setHeader("content-disposition","attachment;filename="+fileName);
//文件名包含中文时需要进行中文编码,否则会出现乱码问题
response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
ServletOutputStream servletOutputStream = response.getOutputStream();
int len = 0;
//设置一个缓冲区,大小取决于文件内容的大小
byte[] buffer = new byte[1024];
//每次读入缓冲区的数据,直到缓冲区无数据
while((len=fileInputStream.read(buffer))!=-1)
{
//输出缓冲区的数据
servletOutputStream.write(buffer,0,len);
}
servletOutputStream.close();
fileInputStream.close();
}