element ui vue 附件预览组件、可预览图片、excel 、pdf.word等文件(浏览器打开文件的方式)

目录

1.组件源码

 2.html 代码

3.组件源码 


此组件就是一个单纯的预览图片、浏览器打开文件的形式简单的组合了下而成的,word、excel是直接下载、pdf浏览器打开的形式,如果想本地打开直接预览的话就直接不用看了。word、excel、pdf 的图片是我放到服务器上的图片地址。

1.组件演示

 2.html 代码

<template>
 <div>
 
  <el-table
       
        :data="lists"
        max-height="620"
        border
        stripe
        style="width: 100%"
        :default-sort="{ prop: 'id', order: 'ascending' }"
      >
        <el-table-column
          label="工作部门"
          prop="workDept"
          width="300px"
          header-align="center"
          align="center"
        />
        <el-table-column
          label="报销人"
          prop="reimbursement"
          header-align="center"
          align="center"
        />
        <el-table-column
          label="报销日期"
          prop="reimbursementDate"
          header-align="center"
          align="center"
        />
       
        <el-table-column
          label="操作"
          header-align="center"
          align="center"
          width="200"
        >
          <template slot-scope="scope">
            <el-button
              type="text"
              size="small"
              icon="el-icon-view"
              @click="showAnnex(scope.row)"
              >附件查看</el-button
            >
           
        </el-table-column>
      </el-table>
 
 
    <el-drawer
      title="费用报销附件信息"
      width="70%"
      :visible.sync="drawerAnnex"
      :direction="direction"
      :modal="true"
      @close="closePreview"
    >
      <file-preview :fileList="previewOptionData"></file-preview>
    </el-drawer>
  </div>
</template>

<script>

import FilePreview from "@/components/FilePreview";
export default {
  name: "Log",
  components: {
  
    FilePreview
  },
  data() {
    return {
      annexList: [],
	  drawerAnnex:false,
	  //list 自己的数据存进去就可以
	  lists:[],
    };
  },
  computed: {
   
    /**
     * 附件预览数据
     *
     */
    previewOptionData() {
      const cloneData = JSON.parse(JSON.stringify(this.annexList)); // 对源数据深度克隆
      return cloneData;
    }
  },
  created() {
  },
  methods: {
      showAnnex(row) {
      this.annexList = row;
      this.drawerAnnex = true;
    },
   
  }
};
</script>
<style>

</style>

3.组件源码 

<template>
  <div class="fileBox">
    <el-row>
      <el-col :span="24">
        <el-carousel
          indicator-position="outside"
          trigger="click"
          :autoplay="false"
        >
          <el-carousel-item v-for="(item, index) in annexList" :key="index">
            <template
              v-if="
                item.typeStr == 'pdf' ||
                  item.typeStr == 'doc' ||
                  item.typeStr == 'docx' ||
                  item.typeStr == 'xlsx' ||
                  item.typeStr == 'xls'
              "
            >
              <div style="    text-align: center;">
                <el-image
                  style=" height:200px;cursor: pointer;"
                  :src="fileUrl + item.filePic"
                  fit="fill"
                  @click="viewAnnex(item.fileUrl)"
                >
                  <div slot="placeholder" class="image-slot">
                    加载中<span class="dot">...</span>
                  </div>
                </el-image>
                <div style="cursor: pointer;" @click="viewAnnex(item.fileUrl)">
                  {{ item.fileName }}
                </div>
              </div>
            </template>
            <template v-else>
              <el-image
                style=" height: 80%;"
                trigger="click"
                :src="fileUrl + item.fileUrl"
                fit="fill"
                :preview-src-list="imgshoWList"
              >
                <div slot="placeholder" class="image-slot">
                  加载中<span class="dot">...</span>
                </div>
              </el-image>
              <div style="cursor: pointer;color:red">
                {{ item.fileName }}
              </div>
            </template>
          </el-carousel-item>
        </el-carousel>
      </el-col>
    </el-row>
  </div>
</template>

<script>
import { getSuffix } from "@/utils/index.js";
export default {
  name: "FilePreview",
  props: {
    fileList: {
      type: Object,
      default: ""
    }
  },
  data() {
    return {
      annexList: [],
      sourceUrl: "",
      imgshoWList: []
    };
  },
  watch: {
    fileList(val) {
      this.imgshoWList = this.value;
      this.showAnnex(val);
    }
  },
  computed: {
    imageUrl() {
      return this.value;
    }
  },
  mounted() {
   
    this.showAnnex(this.fileList);
  },
  methods: {
    showAnnex(row) {
      this.centerAnnex = [];
      this.annexList = [];
      this.annexObj = {};
      this.imgshoWList = [];
      var _this = this;
      /**
       * 返回字段名不同所以我这里需要处理下如果字段名一致则不需要
       */
      //费用报销
      if (row.expensesDetailList) {
        row.fileListSet = row.expensesDetailList;
      }
      //差旅费报销附件
      //travelDetailList
      if (row.travelDetailList) {
        row.fileListSet = row.travelDetailList;
      }
      console.log("行数据", row.fileListSet.length);
      for (let i = 0; i < row.fileListSet.length; i++) {
        this.centerAnnex = JSON.parse(row.fileListSet[i].url);
        console.log("转过来之后的数据", this.centerAnnex);
        for (let j = 0; j < this.centerAnnex.length; j++) {
          //判断文件后缀如果为pdf、word、excel以及其他文件时显示指定图片,
          //.jpg,.png,.txt,.doc,.docx,.pdf,.xlsx,.xls
          let suffix = getSuffix(this.centerAnnex[j].fileUrl);
          switch (suffix) {
            case "pdf":
              this.centerAnnex[j].filePic = "/files/pdf/pdf.jpg";
              break;
            case "xlsx":
              this.centerAnnex[j].filePic = "/files/xlsx/xlsx.jpg";
              break;
            case "xls":
              this.centerAnnex[j].filePic = "/files/xlsx/xlsx.jpg";
              break;
            case "docx":
              this.centerAnnex[j].filePic = "/files/word/word.jpg";
              break;
            case "doc":
              this.centerAnnex[j].filePic = "/files/word/word.jpg";
              break;
          }
          _this.annexList.push({
            filePic: this.centerAnnex[j].filePic,
            fileUrl: this.centerAnnex[j].fileUrl,
            fileName: this.centerAnnex[j].fileName,
            typeStr: suffix
          });
          if (
            suffix != "pdf" &&
            suffix != "doc" &&
            suffix != "docx" &&
            suffix != "xlsx" &&
            suffix != "xls"
          ) {
            _this.imgshoWList.push(this.fileUrl + this.centerAnnex[j].fileUrl);
          }
          if (_this.annexList.length > 0) {
            const url = _this.annexList[0].fileUrl;
            this.getiFremUrl(url, 0);
          }
        }
      }
      console.log("图片地址", _this.imgshoWList);
      this.drawerAnnex = true;
    },
    getiFremUrl(file, i) {
      this.currentIndex = i;
      const url = this.fileUrl + file;
      this.sourceUrl = url;
    },
    viewAnnex(item) {
      window.open(this.fileUrl + item);
    }
  }
};
</script>

<style lang="scss" scoped>

/deep/.el-image__inner,
.el-image__placeholder[data-v-1c1b3b50],
.el-image__error[data-v-1c1b3b50] {
  height: 200px !important;
  width: auto !important;
}
</style>

  2.  getSuffix "@/utils/index.js"js 中的源码(之前不好意思了,忘记贴这段了,多感谢小陈在线学代码童鞋的提醒)


 * 
 * 
 * @param {*} str 
 */

export function getSuffix(str) {
  if (str) {
    var h = str.substring(str.lastIndexOf('.') + 1)
    return h;
  }
}

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue Element UI 提供了一个文件预览组件,可以用于显示各种类型的文件。你可以通过以下步骤来实现文件预览: 1. 首先,在你的 Vue 项目中安装 Element UI,可以使用 npm 或者 yarn 进行安装: ```bash npm install element-ui --save ``` 或者 ```bash yarn add element-ui ``` 2. 在你的 Vue 项目的入口文件中导入 Element UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 在需要使用文件预览组件中,引入并使用 `el-upload` 组件: ```vue <template> <el-upload class="upload-demo" action="//jsonplaceholder.typicode.com/posts/" :on-preview="handlePreview" :file-list="fileList" list-type="picture-card" :auto-upload="false"> <i class="el-icon-plus"></i> </el-upload> </template> <script> export default { data() { return { fileList: [] } }, methods: { handlePreview(file) { // 在这里处理文件预览逻辑 console.log(file) } } } </script> ``` 在上面的示例代码中,我们使用了 `el-upload` 组件来进行文件上传,并且设置了 `list-type` 属性为 `picture-card`,这样上传的文件将会以卡片形式展示。同时,我们还设置了 `:on-preview` 属性来指定文件预览的回调函数 `handlePreview`。 在 `handlePreview` 方法中,你可以自定义文件预览的逻辑,可以使用 Element UI 提供的 Dialog 组件等来展示文件内容。 需要注意的是,这个示例代码只是一个简单的演示,你还需要根据你的需求进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值