我们需要通过一个URL地址获取文件并转为blob流传给前端
思路:
因为java中new File("这里面的路径不能是网络路径"),所以不能直接 通过new File构造器拿到File对象,
可以先通过URL 对象来获取到输入流,再在本地创建一个临时路径写入,再将临时 文件转为文件流反给前端
当然,前端也可以直接 通过a 标签下载,这里主要讲的是前端只能是blob流的形式下载
话不多说,直接 上代码!!
/**
* 下载文件 控制器
*
* @param path url地址
* @param response 响应体
*/
@ApiOperation(value = "下载文件", notes = "下载文件")
@ApiImplicitParam(name = "path", value = "url地址", required = true)
@GetMapping(value = "/downloadFile")
@ResponseBody
public void downloadFile(@RequestParam String path, HttpServletResponse response) {
try {
File tempFile = getFile(path);
try (FileInputStream fis = new FileInputStream(tempFile)) {
byte[] buffer = new byte[fis.available()];
int read = fis.read(buffer);
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Length", "" + tempFile.length());
response.addHeader("Content-Disposition", "attachment;filename=" + new String(tempFile.getName().getBytes()));
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
}
} catch (Exception e) {
log.error("下载出错-》:{}",e.getMessage());
}
}
/**
* 创建一个临时文件
* @param url 远端文件Url
* @return File
*/
private File getFile(String url) {
//对本地文件命名
String fileName = url.substring(url.lastIndexOf("."), url.length());
File file = null;
URL urlfile;
try {
// 创建一个临时路径
file = File.createTempFile("file", fileName);
log.info("tempFile:->{}",file.getAbsolutePath());
//下载
urlfile = new URL(url);
try (InputStream inStream = urlfile.openStream();
OutputStream os = new FileOutputStream(file);) {
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
}
} catch (Exception e) {
log.error("创建临时文件出错:-》{}",e.getMessage());
}
return file;
}