各位小伙伴们大家好,欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展,在这个系列专栏中记录了博主在学习期间总结的大块知识点,以及日常工作中碰到的各种技术点 ┗|`O′|┛
本身前端是可以直接通过文件的url对文件进行下载的,但是在进行业务对接开发的时候,前端没有获取文件下载的权限,以是需要后端获取文件之后把得到的文件流传给前端,前端通过文件流下载文件。
后端获取
controller层
- /**
- * 根据附件id返回文件流
- */
- @ApiOperation(value = "根据附件id返回文件流", notes = "传入附件id")
- @PostMapping(value = "/getByFileId")
- public void getByFileId(HttpServletResponse response, @RequestBody FileIdReq fileIdReq) {
- matterBasicInfoService.getByFileId(response, fileIdReq.getFileId());
- }
复制代码 service接口
- void getByFileId(HttpServletResponse response, String fileId);
复制代码 实现类
- @Override
- public void getByFileId(HttpServletResponse response, String fileId) {
- // 获取附件详情 主要是要附件的url和名字
- MatterAttachmentFormOdr matterAttachmentFormOdr = matterAttachmentFormOdrService.getById(fileId);
- log.error("matterAttachmentFormOdr-----:{}", matterAttachmentFormOdr);
- if (BeanUtil.isEmpty(matterAttachmentFormOdr) || StrUtil.isBlank(matterAttachmentFormOdr.getUrl())) {
- throw new BusinessValidationException("该文件不存在");
- }
-
- // 附件url替换 如果url可以直接下载的话可以跳过这一步
- String filePath = matterAttachmentFormOdr.getUrl().replace("......", "......");
- log.error("filePath-----:{}", filePath);
- ServletOutputStream out = null;
- InputStream inputStream = null;
- try {
- //与服务器建立连接
- URL url = new URL(filePath);
- URLConnection conn = url.openConnection();
- inputStream = conn.getInputStream();
- try {
- //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
- response.setContentType("multipart/form-data");
- response.addHeader("Content-Disposition", "attachment; filename=" + matterAttachmentFormOdr.getName());
- } catch (Exception e){
- e.printStackTrace();
- }
- out = response.getOutputStream();
- // 读取文件流
- int len = 0;
- byte[] buffer = new byte[1024 * 10];
- while ((len = inputStream.read(buffer)) != -1) {
- out.write(buffer, 0, len);
- }
- log.error("读取文件流结束。。。。。。。");
- } catch (Exception e){
- e.printStackTrace();
- } finally {
- try {
- if (out != null) {
- out.flush();
- out.close();
- }
- if (inputStream != null) {
- inputStream.close();
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
复制代码 前端下载
- handleGetFile(file) {
- const type = file.url.split('.')['1']
- if (!file.id) {
- this.$Message.warning('文件下载失败!')
- return
- }
- // 定义参数
- const data = {
- data: {
- fileId: file.id,
- },
- access_token: xxxxxx,
- }
- // 调用后端接口
- this.$store.dispatch('comprehensive/getByFileId', data).then(res => {
- this.$Message.loading(`正在下载${file.name}数据`)
- const applicationType = this.getFileTypeMime(type)
- const blob = new Blob([res.data], { type: applicationType })
- const link = document.createElement('a')
-
- const href = window.URL.createObjectURL(blob) // 创建下载的链接
- link.href = href
- link.download = `${file.name}` // 下载后文件名
- document.body.appendChild(link)
- link.click() // 点击下载
- document.body.removeChild(link) // 下载完成移除元素
- window.URL.revokeObjectURL(href) // 释放掉blob对象
- })
- },
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |