?
需求:實現一個在線預覽pdf、excel、word、圖片等文件的功能。
介紹:支持pdf、xlsx、docx、jpg、png、jpeg。
以下使用Vue3代碼實現所有功能,建議以下的預覽文件標簽可以在外層包裹一層彈窗。?
iframe標簽能夠將另一個HTML頁面嵌入到當前頁面中,我們的圖片也能夠使用iframe標簽來進行展示。
<iframe :src="圖片地址"
style="z-index: 1000; height:650px; width: 100%; margin: 0 auto"
sandbox="allow-scripts allow-top-navigation allow-same-origin allow-popups"
>
「sandbox」這個屬性如果是單純預覽圖片可以不使用,該屬性對呈現在 iframe 框架中的內容啟用一些額外的限制條件。屬性值可以為空字符串(這種情況下會啟用所有限制),也可以是用空格分隔的一系列指定的字符串。
先下載npm包
npm i docx-preview --save
<div class="docxRef"></div>
<script>
import { renderAsync } from 'docx-preview';
function fn() {
// 這里的res.data是 blob文件流,如果自己的不是blob文件流
// 可以通過URL.createObjectURL(參數) 參數為File格式,轉換為blob文件流
let blob = res.data
let childRef = document.getElementsByClassName('docxRef');
renderAsync(blob, childRef[0]) //渲染
}
fn()
</script>
「blob文件流」
下載包
npm install xlsx@0.16.0
<div class="xlsxClass"></div>
const reader = new FileReader();
//通過readAsArrayBuffer將blob轉換為ArrayBuffer對
reader.readAsArrayBuffer(res.data) // 這里的res.data是blob文件流
reader.onload = (event) => {
// 讀取ArrayBuffer數據變成Uint8Array
var data = new Uint8Array(event.target.result);
// 這里的data里面的類型和后面的type類型要對應
var workbook = XLSX.read(data, { type: "array" });
var sheetNames = workbook.SheetNames; // 工作表名稱
var worksheet = workbook.Sheets[sheetNames[0]];
// var excelData = XLSX.utils.sheet_to_json(worksheet); //JSON
let html = XLSX.utils.sheet_to_html(worksheet);
document.getElementsByClassName('xlsxClass')[0].innerHTML = html
};
下載包 npm install pdfjs-dist
我使用的是npm install pdfjs-dist@2.0.943版本,以下例子使用的是vue3+vite創建的項目
以下例子通過canvas來渲染pdf
<template>
<div class="box">
<div class="tool-bar">
<div>{{ pdfParams.pageNumber }} / {{ pdfParams.total }}</div>
<button type="primary" :disabled="pdfParams.pageNumber == pdfParams.total" @click="nextPage">下一頁
</button>
<button type="primary" :disabled="pdfParams.pageNumber == 1" @click="prevPage">上一頁</button>
</div>
<canvas id="pdf-render"></canvas>
</div>
</template>
<script setup>
import { onMounted, ref, reactive } from 'vue'
const pdfParams = reactive({
pageNumber: 1, // 當前頁
total: 0, // 總頁數
});
// 不要定義為ref或reactive格式,就定義為普通的變量
let pdfDoc = null;
// 這里必須使用異步去引用pdf文件,直接去import會報錯,也不知道為什么
onMounted(async ()=> {
let pdfjs = await import('pdfjs-dist/build/pdf')
let pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry')
pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker
// 此文件位于public/test2.pdf
let url = ref('/test2.pdf')
pdfjs.getDocument(url.value).promise.then(doc => {
pdfDoc = doc
pdfParams.total = doc.numPages
getPdfPage(1)
})
})
// 加載pdf的某一頁
const getPdfPage = (number) => {
pdfDoc.getPage(number).then(page => {
const viewport = page.getViewport()
const canvas = document.getElementById('pdf-render')
const context = canvas.getContext('2d')
canvas.width = viewport.viewBox[2]
canvas.height = viewport.viewBox[3]
viewport.width = viewport.viewBox[2]
viewport.height = viewport.viewBox[3]
canvas.style.width = Math.floor(viewport.width) + 'px'
canvas.style.height = Math.floor(viewport.height) + 'px'
let renderContext = {
canvasContext: context,
viewport: viewport,
// 這里transform的六個參數,使用的是transform中的Matrix(矩陣)
transform: [1, 0, 0, -1, 0, viewport.height]
}
// 進行渲染
page.render(renderContext)
})
}
// 下一頁功能
const prevPage = () => {
if(pdfParams.pageNumber > 1) {
pdfParams.pageNumber -= 1
} else {
pdfParams.pageNumber = 1
}
getPdfPage(pdfParams.pageNumber)
}
// 上一頁功能
const nextPage = () => {
if(pdfParams.pageNumber < pdfParams.total) {
pdfParams.pageNumber += 1
} else {
pdfParams.pageNumber = pdfParams.total
}
getPdfPage(pdfParams.pageNumber)
}
</script>
以上pdf代碼引用文章:(54條消息) 前端pdf預覽、pdfjs的使用_pdf.js_無知的小菜雞的博客-CSDN博客
pdfjs官方代碼:例子 (mozilla.github.io)
以上代碼看不懂的地方可以查閱官方代碼,大部分都是固定的寫法。
「以上注意點:」
是一個圖片上傳的功能需求,當用戶選擇本地待上傳的圖片后隱藏上傳組件并本地預覽圖片略縮圖。這是個非常簡單的功能且是前端使用頻率很高的功能,ElementUI為了方便用戶封裝了一套文件上傳的組件el-upload。可以幫助用戶簡單、快捷的實現文件上傳功能,同時還提供了豐富的屬性來實現對文件的各種操作。
這里我們利用ElementUI提供的組件el-upload來實現圖片上傳的功能,ElementUI封裝了很多屬性可以幫助我們快速的實現文件的上傳,監聽、校驗和設限。這里我們不用el-upload的自動上傳功能,所以我們利用屬性:auto-upload="false"來禁止文件自動上傳。屬性on-change可以監聽文件添加、上傳時的狀態改變,利用該屬性觸發自定義事件可以獲取到需要的文件屬性。
圖片上傳的樣式根據設計需求來就可以了,我這里利用flex定義簡單的樣式。圖片預覽我們直接借用el-upload標簽屬性,設置其背景圖片為我們上傳的圖片即可。
on-change屬性在文件狀態改變時的鉤子,添加文件、上傳成功和上傳失敗時都會被調用,利用on-change屬性綁定自定義觸發事件來生成可用于本地預覽的URL地址。e.raw為圖片的實體對象,利用window.createObjectURL(e.raw)來創建圖片地址。
在el-upload中定義屬性:auto-upload="false" 可以禁止文件自動上傳,上傳禁用之后無法通過上傳之后的效果顯示。此時before-upload、on-progress、on-success、on-error、on-preview、on-remove等鉤子函數就無法獲取到文件信息了,所以想獲取到文件的還需要通過on-change屬性來實現。既然禁止了自動上傳那么我們就需要拿到文件對象,我們需要在data中創建一個 FormData 對象來接收文件數據(有文件的form表單上傳數據要用formData類型)。
獲取到文件數據之后我們就可以開始手動上傳文件,如果還需要附上表單數據我們可以通過append繼續向formData中添加數據。formData可以將form表單元素的name與value進行組合,實現表單數據的序列化從而減少表單元素的拼接,提高工作效率。
在form表單中如果要上傳文件,一定要將headers參數 Content-Type=”multipart/form-data”設置封裝數據類型。把數據分成一個一個小段,再利用ajax的send()方法將數據發送至后臺。以上內容是小編給大家分享的【Vue實戰082:el-upload組件實現圖片上傳及預覽】,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。更多Vue實戰技巧可以參考以下專欄:將headers設置成'Content-Type':'multipart/form-data'類型。
首先我們看看效果:
實現這樣的功能需要學習以下幾點內容。
1.認識<img/><map><area/></map>基本結構
首先復制一個html框架,命名為“圖片區域鏈接.html”,示例代碼如下:
<!DOCTYPE HTML>
<html>
<head>
<title>圖片區域鏈接</title>
<meta charset="utf-8">
</head>
<body>
</body>
</html>
向<body></body>中添加<img><map><area/></map>基本結構,示例代碼如下:
<body>
<img/>
<map>
<area/>
</map>
</body>
指定要添加區域鏈接的圖片的路徑,如下:
<img src="img/image1.jpg"/>
<map>
<area/>
</map>
讓<img>標簽通過<map>的名字來驅使<map>為自己工作。
需要兩步,第一,給<map>起名字,name=“map”,為了兼容所有的瀏覽器,還要加上id=“map”(有的瀏覽器只認id)。
第二,讓<img>叫出<map>的名字或id,usemap="#map"。大家要注意,叫名字時要加#。這個在之前的教程中也經常出現。
示例代碼如下:
<img src="img/image1.jpg" usemap="#map"/>
<map name="map" id="map">
<area/>
</map>
下面來劃分區域。
2.為圖片劃分區域的方法
<area>是用來劃分區域的標簽,area也是“”區域“”的意思。
默認的shape(形狀)屬性有“矩形(rect)”、“圓形(circ)”、“多邊形(poly)”三個值。
分別添加三個形狀,示例代碼如下:
<img src="img/image1.jpg" usemap="#map"/>
<map name="map" id="map">
<area shape="rect"/>
<area shape="circ"/>
<area shape="poly"/>
</map>
下面我們就要為區域規定參數,也就是在圖像上的位置和范圍大小。
為<area>添加coords屬性可以指定區域的位置和范圍。
如果shape="rect" 則coords由四個參數組成。例如coords="0,0,50,50"。從左到右,兩兩一組,組成兩個平面坐標,即(0,0)和(50,50),單位是“像素”,矩形區域如下:
如果shape=“circ”,coords=“50,50,10”。(50,50)定義了圓心,10是半徑。如圖:
如果shape=“poly”,coords的參數不少于3對!注意是“對”!從左到右,兩個數就是一組坐標,三組坐標可以確定一個三角形,多組坐標可以確定多邊形。例如
這組參數畫出了下圖中殲20的邊框線(600像素*400像素,如果圖像的長寬像素數變了,參數就不正確了),如圖:
這時,大家會有一個問題:如何才能知道圖像中某個像素點的坐標呢?
3.使用Gimp軟件精準定位圖片區域
使用Gimp軟件可以解決這個問題。
Gimp是一款類似于Photoshop的數字圖像處理軟件,不同的是,Gimp是開源免費的。
下載地址:https://www.gimp.org/
雙擊安裝即可,注意選擇一下安裝目錄。
完成安裝之后打開,界面如下:
點擊“文件”找到“打開”:
選擇要打開的圖片名字:
點擊名稱后,右邊會有圖像預覽,點擊“打開”即可:
打開后如圖:
把鼠標放到圖像的任意位置,看左下角:
這里就會顯示我們鼠標所在的像素坐標數值。
這樣我們就能方便地寫“poly”的coords了。
請在空閑時找一張圖片演練一下吧!
4.為區域添加鏈接
在<area/>標簽中添加href屬性即可指定鏈接路徑,如下:
href="https://www.zhihu.com/question/284642168"
添加title屬性可以在鼠標滑過鏈接區域時提示讀者,如下:
title="殲20氣動外形分析"
今天的內容結束了,圖像區域鏈接在使用時還有一些注意事項,我們下次再詳細討論。
使用碎片時間,學習完整知識!關注大魚師兄,一起精研技藝。
HTML序章(學習目的、對象、基本概念)——零基礎自學網頁制作
HTML是什么?——零基礎自學網頁制作
第一個HTML頁面如何寫?——零基礎自學網頁制作
HTML頁面中head標簽有啥用?——零基礎自學網頁制作
初識meta標簽與SEO——零基礎自學網頁制作
HTML中的元素使用方法1——零基礎自學網頁制作
HTML中的元素使用方法2——零基礎自學網頁制作
HTML元素中的屬性1——零基礎自學網頁制作
HTML元素中的屬性2(路徑詳解)——零基礎自學網頁制作
使用HTML添加表格1(基本元素)——零基礎自學網頁制作
使用HTML添加表格2(表格頭部與腳部)——零基礎自學網頁制作
使用HTML添加表格3(間距與顏色)——零基礎自學網頁制作
使用HTML添加表格4(行顏色與表格嵌套)——零基礎自學網頁制作
16進制顏色表示與RGB色彩模型——零基礎自學網頁制作
HTML中的塊級元素與內聯元素——零基礎自學網頁制作
初識HTML中的<div>塊元素——零基礎自學網頁制作
在HTML頁面中嵌入其他頁面的方法——零基礎自學網頁制作
封閉在家學網頁制作!為頁面嵌入PDF文件——零基礎自學網頁制作
HTML表單元素初識1——零基礎自學網頁制作
HTML表單元素初識2——零基礎自學網頁制作
HTML表單3(下拉列表、多行文字輸入)——零基礎自學網頁制作
HTML表單4(form的action、method屬性)——零基礎自學網頁制作
HTML列表制作講解——零基礎自學網頁制作
為HTML頁面添加視頻、音頻的方法——零基礎自學網頁制作
音視頻格式轉換神器與html視頻元素加字幕——零基礎自學網頁制作
HTML中使用<a>標簽實現文本內鏈接——零基礎自學網頁制作
*請認真填寫需求信息,我們會在24小時內與您取得聯系。