@GetMapping("/download/{resourceId}")
public void downloadResource(@PathVariable String resourceId, HttpServletResponse response) {
// TODO 查询资源路径、资源名称、大小(上传时存入表中)
String path = "";
String name = ""
String size = ""
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
File file = new File(path);
if (file.exists()) {
String userAgent = request.getHeader("user-agent").toLowerCase(Locale.ROOT);
if (userAgent.contains("msie") || userAgent.contains("like gecko")) { // 使用的是IE浏览器或Edge浏览器(在Win10平台上)
name = URLEncoder.encode(name, "UTF-8");
} else {
name = new String(name.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
}
name = name.replace("+", "%20"); // 文件名中的"+"替换为"%20",这是URL编码中表示空格的方式
// 设置响应头
response.setHeader("Content-Disposition", "attachment; filename=\"" + name + "\"");
response.setHeader("Content-Length", size);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileInputStream fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
ServletOutputStream os = response.getOutputStream();
bos = new BufferedOutputStream(os);
// 使用缓冲流逐块复制文件内容
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush();
} else {
response.sendError(455, "下载资源不存在");
}
} catch (IOException e) {
e.printStackTrace();
response.sendError(456, "下载资源时出现错误");
} finally {
// 关闭资源
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Java实现文件下载功能的示例
最新推荐文章于 2024-03-17 00:29:18 发布