背景:前段時間項目需求,要實現文件的預覽功能,我也是耗費了一些時間去研究了下,已實現,並發布上線!目前主流格式的文件都可實現預覽,主要有 圖片文件(png/jpg/jpeg/gif)、文本文檔和office文件(excel/word/pdf)。廢話不多說,直接開始:下面的代碼我本來是寫在一起的,但是為了分開展示,邏輯部分分開寫了,具體寫入到哪里都有標注,需要那塊的,自行合並即可。
前提:點擊“預覽”按鈕,調取接口,后端返回數據為文件流
公共代碼部分:
1 let type = '' 2 const that = this 3 axios({ 4 method: 'GET', 5 url: '', // 你的接口地址 6 responseType: 'blob' 7 }).then(res => { 8 // 拿到數據后的邏輯處理部分!!! 9 })
一、預覽 xls/xlsx 文件
1. 效果:
2. 代碼實現:
1 <div> 2 <table ref="xtable" class="xtable"></table> 3 </div>
1 import XLSX from 'xlsx' // $ npm install xlsx
寫入:公共代碼的紅色字體部分:
1 let reader = new FileReader() 2 reader.onload = e => { 3 //預處理 4 var binary = '' 5 var buf = new Uint8Array(e.target.result) 6 var length = buf.byteLength 7 for (var i = 0; i < length; i++) { 8 binary += String.fromCharCode(buf[i]) 9 } 10 //讀取excel 11 const wb = XLSX.read(binary, { type: 'binary', cellDates: true }) 12 //抓取第一個sheet 13 let wsname = wb.SheetNames[0] 14 let ws = wb.Sheets[wsname] 15 var csv = XLSX.utils.sheet_to_csv(ws) 16 that.$refs.xtable.innerHTML = that.csv2table(csv) 17 } 18 reader.readAsArrayBuffer(res.data)
1 csv2table(csv) { 2 var html = '<table>' 3 var rows = csv.split('\n') 4 rows.pop() // 最后一行沒用的 5 rows.forEach(function(row, idx) { 6 var columns = row.split(',') 7 html += '<tr>' 8 columns.forEach(function(column) { 9 html += 10 `<td style="border: 1px solid #eee; padding: 10px">` + 11 column + 12 '</td>' 13 }) 14 html += '</tr>' 15 }) 16 html += '</table>' 17 return html 18 }
二、預覽 png / gif / jpg /jpeg 文件(圖片文件)
1. 效果:
2. 代碼實現:
1 <div class="demo-image__preview"> 2 <el-image 3 style=" 4 padding: 0 50px; 5 background-size: contain; 6 left: 50%; 7 transform: translate(-50%); 8 " 9 :src="imgSrc" 10 :preview-src-list="[imgSrc]" 11 :z-index="999999999" 12 > 13 </el-image> 14 </div>
寫入:公共代碼的紅色字體部分:
1 let data = window.URL.createObjectURL(res.data) 2 this.imgSrc = data
三、預覽 pdf 文件
1. 效果:
2. 代碼實現:
1 <div class="pdf"> 2 <iframe 3 :src="pdfSrc" 4 frameborder="0" 5 style="width: 1160px; height: 460px" 6 ></iframe> 7 </div>
寫入:公共代碼的紅色字體部分:
1 type = 'application/pdf' 2 let blob = new window.Blob([res.data], { type: type }) 3 let requestUrl = window.URL.createObjectURL(blob) 4 this.pdfSrc = requestUrl
四、預覽 txt 文件
1. 效果:
2. 代碼實現:
1 <el-input v-model="txtPre" type="textarea" :rows="20"></el-input>
寫入:公共代碼的紅色字體部分:
1 let reader = new FileReader() 2 reader.onload = function(e) { 3 that.txtPre = e.target.result 4 } 5 reader.readAsText(res.data)
五、預覽 docx 文件
1. 效果:
2. 代碼實現:
1 <div 2 style="width: 100%; overflow-x: auto; overflow-y: hidden" 3 v-html="docContent" 4 ></div>
1 import mammoth from 'mammoth' // 只能轉換.docx文檔,轉換過程中復雜樣式被忽略。(居中、首行縮進等)$npm install mammoth
寫入:公共代碼的紅色字體部分:
1 let reader = new FileReader() 2 reader.readAsArrayBuffer(res.data) 3 reader.onload = e => { 4 var buf = new Uint8Array(e.target.result) 5 mammoth 6 .convertToHtml({ arrayBuffer: buf }) 7 .then(result => { 8 if (result) { 9 that.docContent = result.value 10 } 11 }) 12 .catch() 13 .done() 14 }
目前 doc 文件的預覽暫時還沒整理出來,上面的幾種文件格式都可實現預覽,親測有效,趕緊碼起來!!!
當然實現預覽的方法也不止這些,我也沒有 一 一做過研究對比,只是列出我所使用的,只要最后能實現都是可以的 ~
整理不易,如果你覺得有用的話就點贊關注一下吧 ~