方式一、传统html、springmvc
//html
<a
href="downLoadProcessDoc.do?name=${c.encodeName}&path=${c.encodeUri }"
target="_blank">打开</a>
@RequestMapping("downLoadProcessDoc")
public ResponseEntity<byte[]> download(HttpServletRequest request,
HttpServletResponse response) throws IOException {
String filePathReq = URLDecoder.decode(URLDecoder.decode(request.getParameter("path"),"utf-8"),"utf-8");
String fileNameReq = URLDecoder.decode(URLDecoder.decode(request.getParameter("name"),"utf-8"),"utf-8");
filePathReq = filePathReq.substring(filePathReq.indexOf("/")+1);
filePathReq = commonService.getUploadFilePath() + "/" + filePathReq;
filePathReq = filePathReq.replaceAll("//", "/");
//上面的代码就是获取文件名跟路径,从来获取文件而已
File file = new File(filePathReq);
HttpHeaders headers = new HttpHeaders();
String fileName = new String(fileNameReq.getBytes("UTF-8"),
"iso-8859-1");// 为了解决中文名称乱码问题
headers.setContentDispositionFormData("attachment", fileName);
//MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file);
headers.setContentType(MediaType.parseMediaType(MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file)));
//headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
vue + springboot
vue
vue调用方法
download (item) {
//调用api
outputFile(encodeURIComponent(item.entityId), 'messageChange', encodeURIComponent(item.path)).then(response => {
const content = response.data
const blob = new Blob([content])
const fileName = item.name
if ('download' in document.createElement('a')) { // 非IE下载
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // 释放URL 对象
document.body.removeChild(elink)
} else { // IE10+下载
navigator.msSaveBlob(blob, fileName)
}
})
},
api.js
/***
* 下载数据
*/
export const outputFile = (entityId, path) => {
return httpRequest.request({
url: `/api/news/outputFile?entityId=${entityId}&path=${path}`,
method: 'get',
responseType: 'blob'
})
}
@GetMapping(value = "/outputFile")
public void outputFile(@RequestParam(value = "entityId", required = false) String enatityId,
@RequestParam(value = "businessType", required = false) String businessType,
@RequestParam(value = "path", required = false) String path, HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 查询文件路径
HrFileAttachmentEntity fileAttachment = hrFileAttachmentService.selectByPath(enatityId, businessType, path);
if (fileAttachment == null){
return;
}
// 读取文件
File file = new File(fileAttachment.getPath());
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileAttachment.getName(), "UTF-8"));
response.addHeader("Content-Length", "" + file.length());
try (BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
OutputStream out = response.getOutputStream();
) {
byte[] buffBytes = new byte[1024];
int read = 0;
while ((read = input.read(buffBytes)) != -1) {
out.write(buffBytes, 0, read);
}
out.flush();
} catch (Exception e) {
logger.error("aaaa", e);
}
}