vue+element在線瀏覽文件輪播組件(支持pdf/doc/excel/jpg/png...多格式多文件瀏覽)

看自己用的框架選擇赖瞒,vue+iview查看器可以參考這篇文章http://www.reibang.com/p/32cd865a8b34

效果圖


微信截圖_20200310161707.png

首先PDF為了提高兼容性钉赁,我們可以加載一個原生的PDF插件(pdf.js)
插件下載地址:http://mozilla.github.io/pdf.js/getting_started/
點擊藍色按鈕的下載就行

image.png

在vue項目下的static添加一個pdf文件夾产禾,放入以下得到的兩個文件夾戒洼,
image.png

在vue項目下的static添加一個jpgView文件夾,放入這兩個文件
viewer.js 和 viewer.css(下載路徑:http://www.reibang.com/p/8ffdbe48859e

安裝base64轉(zhuǎn)換插件:
npm install js-base64 --save

寫個組件頁面(el-carousel自己找文檔看參數(shù),還有doc文檔查看的話只能查看外網(wǎng)的,內(nèi)網(wǎng)的文件看不了(一般現(xiàn)在分內(nèi)外網(wǎng)開發(fā)掘譬,想測試效果的話,可以在正式服務(wù)器扔一份文件看效果))

<template>
<div>
  <el-carousel
    :id="viewerId"
    :autoplay='false'
    v-if="fileUrls !== undefined && fileUrls.length>0"
    @change="changeIndex">
    <el-carousel-item v-for="(item) in PTFurls" :key="item.id">
      <div style="text-align: center;height: 100%;">
        <iframe
          scrolling="auto"
          :src="item.url"
          class="scrollStyle table_120_list"
          frameborder="0"
          width="100%"
          height="100%"
          :id="item.id"
          @load="cardFinish($event,item.id,'pdf')"
        >
          該瀏覽器暫不支持PDF瀏覽呻拌,您可以下載該文件進行查看:
          <a :src="item.url" rel="external nofollow">下載PDF文件</a>
        </iframe>
        <Spin size="large" fix v-if="item.loading"></Spin>
      </div>
    </el-carousel-item>
    <el-carousel-item v-for="(item,index) in DOCurls" :key="index+100">
      <div style="text-align: center;height: 100%;">
        <iframe
          scrolling="auto"
          :src="'http://view.officeapps.live.com/op/view.aspx?src='+item.url"
          class="scrollStyle table_120_list"
          frameborder="0"
          width="100%"
          height="100%"
        >
          該瀏覽器暫不支持文檔瀏覽葱轩,您可以下載該文件進行查看:
          <a :src="item.url" rel="external nofollow">下載文檔文件</a>
        </iframe>
      </div>
    </el-carousel-item>
    <el-carousel-item v-for="(item) in Imgurls" :key="item.id">
      <div style="text-align: center;height: 100%;">
        <img
          :src="item.url"
          style="height:85%;cursor: pointer;width: 100%"
          alt="點擊查看"
          title="點擊查看"
          @click="imgShow(viewerId)"
        />
        <div style="margin-top: 10px;text-align: center;">
          <el-button type="primary" @click="plaintiffDown(item.url)" plain>下載到電腦</el-button>
        </div>
      </div>
    </el-carousel-item>
  </el-carousel>
  <div v-else style="height:500px;text-align: center;margin-top: 50px;width: 100%">暫無數(shù)據(jù)</div>
</div>
</template>
<script>
import '@static/viewer/viewer.css'
import Viewer from '@static/viewer/viewer'
import { urlRedirect } from '@/libs/address'
export default {
  name: 'ZhViewer',
  props: {
    fileUrls: {
      type: Array,
      default: function () {
        return []
      }
    },
    viewerId: {
      type: String
    }
  },
  data () {
    return {
      setting: {
        dots: 'outside',
        radiusDot: true
      },
      nowIndex: 0, // 當前顯示第幾張
      allHost: urlRedirect(), // 域名
      PTFurls: [], // PTF文件
      Imgurls: [], // IMG文件
      DOCurls: [] // DOC文件
    }
  },
  methods: {
    changeIndex (index) {
      this.nowIndex = index
    },
    imgShow (name) {
      // 放在模態(tài)框的有時候會出現(xiàn)第一次圖片放大顯示在模態(tài)框下面,所以加個層級
      let gallery = new Viewer(document.getElementById(name), {
        show: function () {
          gallery.update()
        },
        hide: function() {
          gallery.destroy() // 圖片點擊放大后關(guān)閉圖片時銷毀
        },
        zIndex: 9999
      })
      gallery.show()
    },
    init () {
      // console.log(this.fileUrls)
    },
    plaintiffDown (item) {
      // 必須同源才能下載
      // var alink = document.createElement('a')
      // alink.href = item
      // let type = item.split('.')[1]
      // let name = item.split('.')[0]
      // alink.download = name + '.' + type // 圖片名
      // alink.click()
      // 以上注釋掉的部分藐握,是會在同個頁面上替換鏈接打開圖片酿箭,我們的需求是開新頁面,所以我用了window.open()
      window.open(item)
    },
    cardFinish (e, id, type) {
      // 判斷iframe是否加載完畢
      switch (type) {
        case 'pdf':
          this.PTFurls.forEach((item, index) => {
            if (item.id === id) {
              item.loading = false
              this.$set(item, 'loading', false)
            }
          })
          break
      }
      setTimeout(() => {
        this.nowIndex = 0
      }, 2000)
    },
    spinShow () {
      return false
    }
  },
  mounted () {
    // console.log(this.fileUrls)
  },
  watch: {
    fileUrls: {
      immediate: true,
      handler (val) {
        // 當前域名
        this.allHost = `${urlRedirect()}/`  --------------------------自己的域名自己配
        this.PTFurls = []
        this.DOCurls = []
        this.Imgurls = []
        // console.log('fileUrls', this.fileUrls)
        // 篩選文件分別顯示
        this.fileUrls.forEach((item, index) => {
          let fileType = item.path.split('.')[item.path.split('.').length - 1] // 獲取文件類型
          let url = item.path.indexOf('http://') >= 0 ? item.path : this.allHost + item.path // 過濾文件路徑
          let time = Date.parse(new Date())
          switch (fileType) {
            case 'pdf':
              this.PTFurls.push({
                url: url + '?' + time,
                loading: false,
                id: item.id
              })
              break
            case 'xlsx':
            case 'docx':
              this.DOCurls.push({
                url: url + '?' + time,
                loading: true,
                id: Math.random()
                  .toString(36)
                  .substr(2)
              })
              break
            case 'jpg':
            case 'png':
            case 'jpeg':
              this.Imgurls.push({
                url: url + '?' + time,
                loading: true,
                id: item.id
              })
              break
          }
        })
        // this.nowIndex = this.fileUrls.length - 1
        this.nowIndex = 0
      }
    },
    // 當前輪播的下標 ------------外部刪除或者添加操作的時候會用到
    nowIndex: {
      immediate: true,
      handler (newVal, oldVal) {
        this.$emit('emitNowIndex', newVal)
      }
    }
  }
}
</script>

引入組件趾娃,注冊組件,引用組件

import moreFileViewer from '@/components/fileViewer/moreFileViewer.vue'// 路徑自己放缔御,這里只是例子
components: { moreFileViewer }
// v-if = 'modal'  ---是因為我放在模態(tài)框里面抬闷,一個頁面上有多個數(shù)據(jù)有引入該插件,然后切換的時候根據(jù)外部標簽的顯示隱藏耕突,不然第一份打開正常后笤成,第二份點擊圖片放大的時候圖片不顯示,具體看自己的效果眷茁,有遇到的話可以根據(jù)外部標簽的顯示隱藏做改變
// fileUrls 綁定的數(shù)組炕泳,里面的對象是{path: '鏈接'},記住是path字段上祈,只要傳的數(shù)組里面的對象包含path就行培遵,或者不想叫path,上面組件代碼自己改
 // viewerId 大家都知道登刺,id是唯一的籽腕,所以這個加隨機數(shù),或者你們加下標什么都沒問題纸俭,只要確保不重復就行
// emitNowIndex 獲取當前展示的輪播圖的下標
<more-file-viewer v-if='modal' :fileUrls='viewArr' :viewerId="'one'+Math.floor(Math.random() * 10000)" @emitNowIndex="emitNowIndex"></more-file-viewer>

// 當前展示的文件
emitNowIndex (index) {
     this.nowIndex = index
},
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皇耗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揍很,更是在濱河造成了極大的恐慌郎楼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窒悔,死亡現(xiàn)場離奇詭異呜袁,居然都是意外死亡,警方通過查閱死者的電腦和手機简珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門傅寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事荐操∥呤悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵托启,是天一觀的道長宅倒。 經(jīng)常有香客問我,道長屯耸,這世上最難降的妖魔是什么拐迁? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮疗绣,結(jié)果婚禮上线召,老公的妹妹穿的比我還像新娘。我一直安慰自己多矮,他們只是感情好缓淹,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塔逃,像睡著了一般讯壶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湾盗,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天伏蚊,我揣著相機與錄音,去河邊找鬼格粪。 笑死躏吊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的帐萎。 我是一名探鬼主播颜阐,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吓肋!你這毒婦竟也來了凳怨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤是鬼,失蹤者是張志新(化名)和其女友劉穎肤舞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體均蜜,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡李剖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了囤耳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篙顺。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡偶芍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出德玫,到底是詐尸還是另有隱情匪蟀,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布宰僧,位于F島的核電站材彪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琴儿。R本人自食惡果不足惜段化,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造成。 院中可真熱鬧显熏,春花似錦、人聲如沸晒屎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夷磕。三九已至,卻和暖如春仔沿,著一層夾襖步出監(jiān)牢的瞬間坐桩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工封锉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绵跷,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓成福,卻偏偏與公主長得像碾局,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奴艾,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容