前言
java实现对文件的下载功能能,在之前的前端下载,后端你接收文件两篇文章的基础上再来一个文件下载,配合起来就完整了。
点击可查看前面内容:
vue前端文件下载
java后端接收保存多文件
后端文件下载
这个方法做了个简单的测试,接收的str
就是我上传的文件目录地址,因为之前的上传保存文件会返回一个文件目录地址,所以可以根据这个值去获取对应的文件。
在实际的开发中,文件服务器接口返回的应该是一个标准的链接地址。
// str:文件目录地址
public void testDown(HttpServletResponse response, String str) throws Exception {
// 这个判断主要是防止为null,放这里是因为我原本的操作由分割字符串的操作,所以做了判断,
// 如果需要使用,这个可以改,不重要,关注下面的下载方法体
if (str.length()>1){
File file = new File(str);
// 判断当前文件是否存在
if (!file.exists()){
throw new BusinessException("当前附件" + str + "不存在!");
}
String fileName = file.getName();
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("multipart/form-data;charset=utf-8");
// 设置头部参数对应前面的文章,前端下载文件方法
// 从 headers中拿到 fileName
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".pdf");
response.setHeader("filename", fileName + ".pdf");
//设置类型
response.setContentType("application/x-msdownload");
//设置编码
response.setCharacterEncoding("utf-8");
// 读取下载的文件
FileInputStream bis;
OutputStream os;
bis = new FileInputStream(file);
// 相应文件返回到 response中
os = response.getOutputStream();
//创建一个byte对象
byte[] buff = new byte[1024];
int i=0;
while ((i = bis.read(buff)) != -1) {
os.write(buff, 0, i);
}
bis.close();
os.close();
}
}
二、总结
下载文件:
从指定目录下获取文件:bis = new FileInputStream(file);
相应到respinse中返回:os = response.getOutputStream();
保存文件:
获取指定文件的输入流:
inputStream = file.getInputStream();
将读取到的文件输出到指定目录文件:
os = new FileOutputStream(tempFile.getPath()+ “/” + File.separator + fileName);