pdf跟图片上传 以及pdf下载 图片放大展示

本文介绍了一种基于Vue.js的电子资料上传与展示组件,详细解释了如何处理PDF与图片的上传、展示及预览。组件支持多文件上传,限制文件类型与大小,并提供了文件预览、下载和自定义样式。

在这里插入图片描述
html展示的部分

<ul class="electronicbox">
       // 多获取的数据循环  对是pdf的样式单独处理
      <li v-for="(item,index) in electronicData" :key="index" :class="!isdown(item)?'pdfstyle':''">
        // 如果是pdf展示文字
        <p v-if="!isdown(item)">pdf</p>
        // 图片的展示方式
        <img :src="baseurl+'/'+item.fileInfo" alt="">
        // 底部的文字展示
        <span>{{ item.fileName }}</span>
        // 鼠标hover 时展示的下载 放大 方法
        <div class="electronicboxhover">
          <i v-if="isdown(item)" class="el-icon-zoom-in" @click="handlePictureCardPreview(baseurl+'/'+item.fileInfo)" />
          <i v-else class="el-icon-download" @click="handlePictureCardDown(item.fileInfo)" />
        </div>
      </li>
    </ul>
// 样式
.electronicbox{
  .pdfstyle{
    p{
      font-size: 24px;
      color: #fff;
      width: 100%;
      position: absolute;
      margin: 0;
    }
    background:rgba(255,94,94, 1);
    text-align: center;
  }
}
.electronicbox li{
  position: relative;
  img{
    width: 100%;
    height: 100%;
  }
  span{
    position: absolute;
    bottom:-25px;
    left: 0;
    text-align: center;
    width:100%;
    font-size: 14px;
    white-space:nowrap;/* 规定文本是否折行 */
    overflow: hidden;/* 规定超出内容宽度的元素隐藏 */
    text-overflow: ellipsis;
  }
}
.electronicboxhover{
  display: none;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0,0,0,.5);
  width: 300px;
  color: #fff;
  height: 90px;
  border-radius: 8px;
  box-shadow: -2px 0 3px -1px #ccc, 0 -2px 3px -1px #ccc, 0 2px 3px -1px #ccc,
  2px 0 3px -1px #ccc; //右边阴影
  cursor: pointer;
  i{
    position:absolute;
    top: 0;
    left: 0;
    bottom:0;
    right: 0;
    margin: auto;
    text-align: center;
    font-size: 22px;
    height: 22px;
  }
}
.electronicbox li:hover .electronicboxhover{
  display: block;
}

判断是否是pdf文件

 isdown(item) {
      return item.fileInfo.split('.')[1] !== 'pdf'
    },

先说pdf下载

handlePictureCardDown(file) {
      window.location.href = process.env.VUE_APP_FILEUP_API + '/api/download?fileName=' + file
    },

图片放大弹窗展示

handlePictureCardPreview(file) {
      this.dialogImageUrl = file
      this.dialogVisible = true
    },
    
<el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" alt="">
    </el-dialog>

上传图片以及pdf的组件

  • 如果时候多张上传
  • :auto-upload=“false”
  • :multiple=“true”
    在这里插入图片描述
<template>
  <div class="staffUpData">
    <el-dialog :close-on-click-modal="false" :visible.sync="isshow" width="800px" @close="closedialog">
      <div class="post-information-title"><span><img src="@/icons/rightArrow.png" alt=""></span>
        资料上传</div>
      <!-- on-change 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
      show-file-list 是否显示已上传文件列表
      auto-upload 是否在选取文件后立即进行上传
      -->
      <p style="font-size: 12px;color: #ccc;margin-top:20px;">可上传pdf、jpg、png格式,不能超过2M</p>
      <el-upload
        ref="upload"
        :action="baseurl+'/employeeManage/uploadElectronicData'"
        list-type="picture-card"
        :on-remove="handleRemove"
        :on-change="changeUpload"
        :auto-upload="false"
        :show-file-list="true"
        accept="image/png, image/jpeg, application/pdf"
        :data="form"
        :limit="5"
        :on-exceed="limitFn"
        :before-upload="beforeAvatarUpload"
        :on-success="handleAvatarSuccess"
      >
        <i class="el-icon-plus" />
        <!-- <img v-if="imageUrl" :src="imageUrl" class="avatar"> -->
      </el-upload>
      <!-- :on-preview="handlePictureCardPreview" -->
      <!-- 确定按钮 -->
      <div slot="footer" class="dialog-footer">
        <el-button @click="isshow = false">取 消</el-button>
        <el-button type="primary" @click="uploadSumit">确 定</el-button>
      </div>
      <el-dialog :visible.sync="dialogVisible">
        <img width="100%" :src="dialogImageUrl" alt="">
      </el-dialog>
    </el-dialog>
  </div>

</template>

<script>

import { uploadElectronicData } from '@/api/staffhmc'
import axios from 'axios'
export default {
  name: 'StaffUpData',
  components: {
  },
  data() {
    return {
      dialogImageUrl: '',
      dialogVisible: false,
      disabled: false,
      isshow: false,
      imageUrl: '',
      baseurl: process.env.VUE_APP_BASE_API,
      form: {
        electronicDataList: [],
        employeeId: '',
        dirName: 'public/personnel/userinfo'
      }
    }
  },
  created() {
  },
  mounted() {
  },
  methods: {
    limitFn() {
      this.$message({
        message: '最多上传5个文件',
        type: 'warning'
      })
    },
    closedialog() {
      this.$refs.upload.clearFiles()
    },
    uploadSumit() { // 上传文件
      uploadElectronicData(this.form).then((res) => {
        this.$message({
          message: '上传成功',
          type: 'success'
        })
      }).catch(() => {
        this.$message({
          message: '最多上传5个',
          type: 'error'
        })
      })

      this.isshow = false
    },
    openDialog(employeeId) {
      this.isshow = true
      this.form.employeeId = employeeId
      // employeeId && this.editEmployeeStatusDetail()
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.dialogVisible = true
    },
    handleDownload(file) {
      console.log(file)
    },
    // 删除
    handleRemove(file, fileList) {
      console.log(file, fileList, '1')
    },
    // 上传之前
    beforeAvatarUpload(file) {

    },
    // 上传成功
    handleAvatarSuccess() {

    },
    // 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
    changeUpload(file, fileList) {
      const isJPG = file.raw.type === 'image/jpeg'
      const isPng = file.raw.type === 'image/png'
      const isPdf = file.raw.type === 'application/pdf'
      const isLt2M = file.raw.size / 1024 / 1024 < 2
      if (!isLt2M) {
        this.$message.error('上传文件大小不能超过 2MB!')
      }
      if (!isJPG && !isPng && !isPdf) {
        this.$message.error('只能上传 JPG/PNG/PDF 格式!')
      }
      this.$refs.upload.uploadFiles = this.$refs.upload.uploadFiles.filter((item) => {
        return item.raw.size / 1024 / 1024 < 2
      })
      this.tobase64(fileList) // 也可以传  file   file.raw === fileList[i].raw
    },
    // 对文件的处理
    tobase64(fileList) {
      this.form.electronicDataList = []
      for (let i = 0; i < fileList.length; i++) {
        var reader = new FileReader()
        // readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend 事件,同时 result 属性将包含一个data:URL格式的字符串(base64编码)以表示所读取文件的内容。
        reader.readAsDataURL(fileList[i].raw)
        // 当 FileReader 读取文件的方式为  readAsArrayBuffer, readAsBinaryString, readAsDataURL 或者 readAsText 的时候,会触发一个 load 事件。从而可以使用  FileReader.onload 属性对该事件进行处理。
        reader.onload = (e) => {
          const tempobj = {
            data: e.target.result.split(',')[1], // 上传图片的内容
            suffix: '.' + fileList[i].raw.type.split('/')[1], // 后缀
            fileName: fileList[i].name // 名字
          }
          this.form.electronicDataList.push(tempobj)
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.post-information-title{
  font-size: 15px;
  margin: -35px 10px 10px 10px ;
  color: dodgerblue;
  span{
    display: inline-block;
    width: 11px;
    height: 100%;
    img{
      width: 100%;
    }
  }
}
</style>

<style lang="scss">
// 这个样式是处理 文字显示以及pdf单独加样式的
.staffUpData .el-upload-list--picture-card .el-upload-list__item{
  overflow: inherit;
  float: left;
  background:rgba(255,94,94,1); // 红色
  margin-top:20px;
  img{
    display: block;
  }
}
.staffUpData .el-upload-list--picture-card .el-upload-list__item-name{
  display:block;
  width:100%;
}
.staffUpData .el-upload--picture-card{
  margin-top:20px;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值