说明
其实只需要按照普通文件流下载即可,以下是一个例子,仅供参考。
springboot接口
@RestController
@RequestMapping("/api/files")
public class FileController {
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile() throws IOException {
// Assume the ZIP file is located in the resources folder
File file = new File("src/main/resources/sample.zip");
InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=sample.zip")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.contentLength(file.length())
.body(resource);
}
}
- 或者是采用传统
@GetMapping(value = "/download")
public void exportTasks(HttpServletResponse response) throws IOException {
try {
String filePath = "d:/tmp/aaa.zip";
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException("File not found: " + filePath);
}
String fileName = FilenameUtils.getName(filePath);
// 对中文文件名进行编码
String zipFileName = URLEncoder.encode(fileName, CharsetUtil.UTF_8);
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(zipFileName, "utf-8"));
response.setContentType("application/octet-stream;charset=UTF-8");
try (InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
} catch (Exception e) {
log.error("下载出错", e);
}
}
vue调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Download ZIP Example</title>
</head>
<body>
<div id="app">
<button @click="downloadZip">Download ZIP</button>
</div>
<!-- 引入 Vue -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<!-- 引入 Axios -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
new Vue({
el: '#app',
methods: {
async downloadZip() {
try {
const response = await axios.get('http://localhost:8080/api/files/download', {
responseType: 'blob', // 处理二进制数据
});
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'sample.zip'); // 下载的文件名
document.body.appendChild(link);
link.click();
link.remove();
} catch (error) {
console.error('Error downloading the file:', error);
}
}
}
});
</script>
</body>
</html>