前端實現文件預覽功能(png/jpg/jpeg/gif/txt/xls/xlsx/docx)


背景:前段時間項目需求,要實現文件的預覽功能,我也是耗費了一些時間去研究了下,已實現,並發布上線!目前主流格式的文件都可實現預覽,主要有 圖片文件(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 文件的預覽暫時還沒整理出來,上面的幾種文件格式都可實現預覽,親測有效,趕緊碼起來!!!

當然實現預覽的方法也不止這些,我也沒有 一 一做過研究對比,只是列出我所使用的,只要最后能實現都是可以的 ~

整理不易,如果你覺得有用的話就點贊關注一下吧 ~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM