当前位置:   article > 正文

vue项目,后端返回二进制文件流,前端如何实现文件在线预览_后端返回二进制文件流,前端vue实现在线预览

后端返回二进制文件流,前端vue实现在线预览

 <button class="btn btn-primary" @click="openPdfViewer(scope)"> 预览</button>

点击按钮,弹个框,框里是文件的容器元素。然后用v-if来控制元素的隐藏与显示以下是结构。

  1. <el-dialog title="预览" :visible.sync="previewDialog" :append-to-body="true" fullscreen center>
  2. <iframe v-if="previewType == 1" :src="url" frameborder="0" width="100%" height="800px"></iframe>
  3. <!-- excel -->
  4. <div v-if="previewType == 2" v-html="excelHtml" ref="execl" class="excel_preview_table">
  5. </div>
  6. <!-- word -->
  7. <div v-if="previewType == 3" ref="word" style="font-size: 18px;text-align: center;margin-top: 30px;">
  8. </div>
  9. </el-dialog>

前端要用到的插件:

execl用到的是import XLSX from 'xlsx'; 可以用npm  i xlsx下载,支持xls,xlsx。

word用到的是 const docx = require("docx-preview"); window.JSZip = require("jszip");

可以用npm i docx-preview@0.1.4 (版本可以根据自己的情况,我是直接用的这个) , npm i jszip下载,支持doc,docx。

  1. import XLSX from 'xlsx';//引入
  2. const docx = require("docx-preview");
  3. window.JSZip = require("jszip");

在methods定义函数,用axios调后端接口,拿到后端返回的数据,根据文件格式进行对应的处理

  1. // 文件预览
  2. openPdfViewer(scope) {
  3. // return
  4. // this.fileId = scope.row.id;
  5. var formdata = new FormData();
  6. formdata.append('id', scope.row.id);
  7. if (scope.row.attachmentName.endsWith('.pdf')) {
  8. this.$axios({
  9. url: '/businessTechnology/preview',
  10. data: formdata,
  11. method: 'post',
  12. responseType: 'blob'
  13. }).then(res => {
  14. // console.log(res.data.type);
  15. this.previewDialog = true
  16. this.previewType = 1
  17. const blob = new Blob([res.data], { type: 'application/pdf' });
  18. // 创建用于作为PDF预览源的Blob的URL
  19. this.url = URL.createObjectURL(blob);
  20. }).catch(error => {
  21. console.error('Error getting file:', error);
  22. });
  23. } else if (scope.row.attachmentName.endsWith('.xls') || scope.row.attachmentName.endsWith('.xlsx')) {
  24. console.log('execl');
  25. this.$axios({
  26. method: 'post',
  27. data: formdata,
  28. responseType: 'arraybuffer', // 设置响应体类型为arraybuffer
  29. url: '/businessTechnology/preview',
  30. }).then(res => {
  31. console.log(res);
  32. this.previewDialog = true
  33. this.previewType = 2
  34. let workbook = XLSX.read(new Uint8Array(res.data), { type: "array" }); // 解析数据
  35. let worksheet = workbook.Sheets[workbook.SheetNames[0]]; // workbook.SheetNames 下存的是该文件每个工作表名字,这里取出第一个工作表
  36. this.excelHtml = XLSX.utils.sheet_to_html(worksheet); // 渲染
  37. console.log(this.excelHtml);
  38. });
  39. } else if (scope.row.attachmentName.endsWith('.doc') || scope.row.attachmentName.endsWith('.docx')) {
  40. console.log('word');
  41. this.$axios({
  42. method: 'post',
  43. data: formdata,
  44. responseType: 'blob',
  45. url: '/businessTechnology/preview',
  46. }).then(res => {
  47. this.previewType = 3
  48. this.previewDialog = true
  49. this.$nextTick(()=>{
  50. docx.renderAsync(res.data,this.$refs.word) // 渲染到页面预览
  51. })
  52. });
  53. }
  54. },

本人亲测,可以正常使用,有问题可以一起探讨。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号