下载文件工具

方式一、传统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);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值