使用springboot实现文件下载
本地文件下载(需要文件的绝对路径)
步骤一封装文件下载api工具类:
@Slf4j
@Component
public class CommonDownLoadUtil {
/**
* @param response 客户端响应
* @throws IOException io异常
*/
public void downLoad(HttpServletResponse response, String downloadUrl) throws Throwable {
if (Objects.isNull(downloadUrl)) {
// 如果接收参数为空则抛出异常,由全局异常处理类去处理。
throw new NullPointerException("下载地址为空");
}
// 读文件
File file = new File(downloadUrl);
if (!file.exists()) {
log.error("下载文件的地址不存在:{}", file.getPath());
// 如果不存在则抛出异常,由全局异常处理类去处理。
throw new HttpMediaTypeNotAcceptableException("文件不存在");
}
// 获取用户名
String fileName = file.getName();
// 重置response
response.reset();
// ContentType,即告诉客户端所发送的数据属于什么类型
response.setContentType("application/octet-stream; charset=UTF-8");
// 获得文件的长度
response.setHeader("Content-Length", String.valueOf(file.length()));
// 设置编码格式
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
// 发送给客户端的数据
OutputStream outputStream = response.getOutputStream();
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
// 读取文件
bis = new BufferedInputStream(new FileInputStream(new File(downloadUrl)));
int i = bis.read(buff);
// 只要能读到,则一直读取
while (i != -1) {
// 将文件写出
outputStream.write(buff, 0, buff.length);
// 刷出
outputStream.flush();
i = bis.read(buff);
}
}
}
备注:
- 本文将工具类加了@Component交给spring管理了,当然,也可以将此方法使用静态方法封装。
- 本文的全局异常处理,可以选择try->catch,也可以使用全局异常处理类去处理(全局异常具体看上文)。
- 将工具类封装之后,则可以使用了,这里代码的调用,本文就不再叙述了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。