java实现文件流下载
java Controller代码
@ApiOperation(value = "文件下载")
@ApiImplicitParams({
@ApiImplicitParam(name = "filePath", value = "文件路径", required = true),
@ApiImplicitParam(name = "fileName", value = "文件名", required = true)
})
@GetMapping("/down")
public ReturnResult<Void> downFile(@RequestParam("filePath") String filePath, @RequestParam("fileName") String fileName, HttpServletResponse response) {
ReturnResult<Void> result = new ReturnResult<>();
String url = filePath + "/" + fileName;
if (url.indexOf(KEY) == 0) {
url = url.substring(1);
}
File file = new File(url);
if (!file.exists()) {
result.setStatus(ConstV.RETURN_404);
result.setMessage("源文件已不存在");
return result;
}
try (FileInputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream()) {
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
byte[] buffer = new byte[1024];
int i;
while ((i = is.read(buffer)) != -1) {
os.write(buffer, 0, i);
}
os.flush();
os.close();
result.setStatus(ConstV.RETURN_OK);
return result;
} catch (Exception e) {
log.error("下载文件发生错误," + e.getMessage());
result.setStatus(ConstV.RETURN_ERROR);
result.setMessage("下载文件发生错误," + e.getMessage());
return result;
}
}
vue.js代码
async down(row) {
try {
var response = await downFile(row.filePath, row.fileName)
if (response.type === 'application/json') {
this.$message({ message: '源文件已不存在或下载时发生错误' })
return
}
console.log(response)
this.downFile(response, row.fileName)
} catch (error) {
ErrMessage(error)
}
},
downFile(content, fileName) {
const blob = new Blob([content])
const a = document.createElement('a')
const url = window.URL.createObjectURL(blob)
const filename = fileName
a.href = url
a.download = filename
a.click()
window.URL.revokeObjectURL(url)
}