我是靠谱客的博主 温柔山水,最近开发中收集的这篇文章主要介绍elementui+vue管理后台-文件上传下载与预览,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

工具类


//utils/downloadFile
class DownloadFile { 
    /**
     * 
     * @param {*} file 文件流
     * @returns 
     */ 
    getObjectURL(file) {
        let url = null;
        if (window.createObjectURL !== undefined) {
            // basic
            url = window.createObjectURL(file);
        } else if (window.webkitURL !== undefined) {
            // webkit or chrome
            try {
                url = window.URL.createObjectURL(file);
            } catch (error) {
                console.log(error);
            }
        } else if (window.URL !== undefined) {
            // mozilla(firefox)
            try {
                url = window.URL.createObjectURL(file);
            } catch (error) {
                console.log(error);
            }
        }
        return url;
    } 
    /**
     * 文件点击下载
     * @param {*} blob 文件流
     * @param {*} fileName 文件名
     */
    downloadFile(blob, fileName) {
        let eleLink = document.createElement("a");
        eleLink.download = fileName;
        eleLink.style.display = "none";
        // 字符内容转变成blob地址
        eleLink.href = this.getObjectURL(blob);
        // 自动触发点击
        document.body.appendChild(eleLink);
        eleLink.click();
        // 然后移除
        document.body.removeChild(eleLink);
    }
    
      /**
     * 获取文件名后缀
     * @param {*} filename 文件名
     * @returns 
     */
       getFileFix(filename) {
        let fix = filename.substring(filename.lastIndexOf(".") + 1).toLocaleLowerCase();
        return fix;
    }

    /**
     * 是否可预览
     * @param {*} filename 文件名
     * @returns true可,false不可
     */
    isPreview(filename){
        let fix = this.getFileFix(filename)
        switch (fix) {
            case "jpg":
            case "jpge":
            case "png":
            case "pdf":
            case "mp4":
            case "txt":{
                return true
            } 
            default: {
                return false
            }
        } 
    }
    
    /**
     * 预览文件
     * @param {*} blob 文件流
     */
    preview(blob){
        return this.getObjectURL(blob);
    }

    /**
     * 是服务器流 false 本地流true
     * @param {*} blob 文件流
     */
    static isLocalFile(blob){
        return blob.raw ? true : false
    }

}

export default DownloadFile

html

  <el-form-item label="协议附件" prop="gisfileUrl">
              <div class="upload-wrap">
                <el-upload
                  class="upload-demo"
                  ref="gisFile"
                  action="#"
                  multiple
                  :file-list="fileList"
                  :on-remove="handleRemove"
                  :on-change="handleChangeFile"
                  :auto-upload="false"
                  :show-file-list="true"
                >
                  <el-button size="small" type="primary" width="80px">
                    上传
                  </el-button>
                </el-upload>
                <div class="upload-other-btn">
                  <el-button
                    size="small"
                    type="success"
                    width="80px"
                    @click="downloadFileClick"
                  >
                    下载
                  </el-button>

                  <el-button
                    size="small"
                    type="warning"
                    width="80px"
                    @click="pOpen = true"
                  >
                    预览
                  </el-button>
                </div>
              </div>
            </el-form-item>

<!-- 文件预览iframe -->
        <el-dialog
          title="预览窗口"
          :visible.sync="iOpen"
          width="80%"
          height="600px"
          append-to-body
          :close-on-click-modal="false"
        >
          <div class="boxl-center-pdf">
            <iframe
              id="printIframe"
              :src="fileSrc"
              frameborder="0"
              style="width: 100%; height: 500px"
            />
          </div>
        </el-dialog>

js-data数据

  // 文件列表
      fileList: [],
      // 预览对话框控制
      pOpen: false,
      // 预览iframe控制
      iOpen: false,
      // iframe展示src
      fileSrc: null, 
      // 输入导入文件列表
      fileList2: [],

js-methods逻辑代码


    // 文件发生改变
    handleChangeFile(file, fileList) {
      this.fileList = fileList;
    },
    // 删除文件
    handleRemove(file, fileList) {
      this.fileList = fileList;
      if (!file.id) {
        console.log("当前文件没有fileId");
        return;
      }
      console.log(file);
      if (this.form.demolitionId != null) {
        deleteFile({
          fileId: file.id,
        }).then((res) => {
          console.log(this.form.agreementAnnexFolderId);
          let tempStr = this.form.agreementAnnexFolderId;
          tempStr = tempStr.split(",");

          // 相同则认为已删除,剔除掉
          let newStr = tempStr.filter((item, index) => {
            return item != file.id ? true : false;
          });
          this.form.agreementAnnexFolderId = newStr.toString();
        });
      }
    },
    // 下载点击
    downloadFileClick() {
      // 循环文件列表
      this.fileList.forEach(async (item) => {
        // 是本地文件
        if (DownloadFile.isLocalFile(item)) {
          this.getDownLoadFile(item.raw, null, item);
        } else {
          // 获取服务器文件
          const res = await requestDownLoadFile({
            fileId: item.id,
          });
          this.getDownLoadFile(res.data, res["headers"]["content-type"], item);
        }
      });
    },
    // 获取后台文件并下载/预览
    async getDownLoadFile(blobFile, type, row) {
      let downloadBolb = null;

      downloadBolb = new Blob([blobFile], {
        type: type,
      });

      let d = new DownloadFile();
      if (!this.iOpen) {
        // 下载文件
        d.downloadFile(downloadBolb, row.name);
      } else {
        // 预览文件
        this.fileSrc = d.preview(downloadBolb);
      }

      return downloadBolb;
    },
    // 上传文件
    async uploadFiles(oldFileList) {
      // 没有文件不上传
      if (oldFileList.length === 0) return;

      let dataFlight = new FormData();
      oldFileList.forEach((item) => {
        if (item.raw) {
          dataFlight.append("files", item.raw);
        }
      });

            return downloadBolb
        },
        // 上传文件
        async uploadFiles(oldFileList) {
            // 没有文件不上传
            if (oldFileList.length === 0) return;

      let loadingInstance = Loading.service({
        fullscreen: true,
        text: "正在提交...",
      });

      const res = await axios.all([uploadFile(dataFlight)]);

      this.$nextTick(() => {
        // 以服务的方式调用的 Loading 需要异步关闭
        loadingInstance.close();
      });

      if (this.form.demolitionId != null) {
        //修改赋值
        // 新上传的id
        let tempArr = res[0].data.fileIds.toString();
        tempArr = tempArr.split(",");
        // 拼接旧的id
        tempArr.push(...this.form.agreementAnnexFolderId.split(","));
        // 重新上传
        console.log(tempArr.toString());
        this.form.agreementAnnexFolderId = tempArr.toString();
      } else {
        this.form.agreementAnnexFolderId = res[0].data.fileIds;
      }

      this.$refs["gisFile"].clearFiles();
    },

    // 预览文件
    async preview(row) {
      let d = new DownloadFile();
      // 初始化
      this.fileSrc = "";
      // 判断文件是否可预览
      if (d.isPreview(row.name)) {
        this.iOpen = true;
        // 是本地文件
        if (DownloadFile.isLocalFile(row)) {
          this.getDownLoadFile(row.raw, row.raw.type, row);
        } else {
          // 获取服务器文件
          const res = await requestDownLoadFile({
            fileId: row.id,
          });
          this.getDownLoadFile(res.data, res["headers"]["content-type"], row);
        }
      } else {
        this.$modal.msgError(`当前文件不可预览`);
      }
    },

 // 获取上传列表
    getUploadFileList() {
      return this.fileList.filter((item) => {
        if (DownloadFile.isLocalFile(item)) {
          return true;
        }
        return false;
      });
    },
    /** 提交按钮 需要对文件处理*/
    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (valid) {
          console.log(this.form);
          if (this.form.demolitionId != null) {
            // 上传文件
            await this.uploadFiles(this.getUploadFileList());
            await updateDemolition(this.form).then((response) => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            // 上传文件
            await this.uploadFiles(this.getUploadFileList());
            await addDemolition(this.form).then((response) => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },

最后

以上就是温柔山水为你收集整理的elementui+vue管理后台-文件上传下载与预览的全部内容,希望文章能够帮你解决elementui+vue管理后台-文件上传下载与预览所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部