Vue如何实现文件预览和下载功能的前端上传组件

 更新时间:2024年09月29日 10:27:51   作者:和烨  
在Vue.js项目中,使用ElementUI的el-upload组件可以轻松实现文件上传功能,通过配置组件参数和实现相应的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在前端开发中,文件上传和预览是常见的功能需求之一。本文将介绍如何利用 Vue.js 结合 Element UI 的上传组件(el-upload)实现文件上传,并根据文件类型进行预览或下载的功能。

1.准备工作

首先,确保你的项目中已经引入了 Vue.js 和 Element UI。在这个示例中,我们使用了 el-upload 组件来管理文件上传。

1.1 创建 Vue 组件

在 Vue 组件中,我们需要实现以下功能:

  • 文件上传功能
  • 文件预览功能(针对图片类型)
  • 文件下载功能(对于其他类型的文件)
<template>
  <div>
    <el-upload
      v-model:file-list="fileList"
      action="你的上传地址"
      :on-success="handleFileSuccess"
      :on-remove="handleFileRemove"
      :on-error="handleFileError"
      :limit="10"
      :data="fileFormData"
      name="files"
      :on-preview="openFile"
    >
      <el-button type="primary">点击上传</el-button>
    </el-upload>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      fileList: [], // 上传文件列表
      fileFormData: {}, // 额外的上传参数,如果需要的话
      imageExtensions: ["jpg", "jpeg", "png", "gif", "bmp"], // 图片格式后缀
    };
  },
  methods: {
    async openFile(file) {
      try {
        const response = await axios.get(`/bbjApi/system/systemfile/${file.id}`, {
          responseType: "blob", // 设置响应类型为 blob
        });
        const blob = new Blob([response.data], {
          type: response.headers["content-type"],
        });
        const url = window.URL.createObjectURL(blob);

        // 根据文件类型设置预览方式
        const lowerCaseInput = file.name.toLowerCase();
        if (this.imageExtensions.some((ext) => lowerCaseInput.endsWith("." + ext))) {
          // 如果是图片类型,创建弹窗进行预览
          this.createImageModal(url);
        } else {
          // 其他类型的文件直接下载
          this.downloadFile(url, file.name);
          window.URL.revokeObjectURL(url); // 释放对象 URL
        }

      } catch (error) {
        this.$message.error("打开文件异常,请联系管理员");
      }
    },
    createImageModal(url) {
      // 创建弹窗容器
      const modalContainer = document.createElement("div");
      modalContainer.style.position = "fixed";
      modalContainer.style.top = "0";
      modalContainer.style.left = "0";
      modalContainer.style.width = "100%";
      modalContainer.style.height = "100%";
      modalContainer.style.backgroundColor = "rgba(0, 0, 0, 0.7)";
      modalContainer.style.zIndex = "9999";
      modalContainer.style.display = "flex";
      modalContainer.style.justifyContent = "center";
      modalContainer.style.alignItems = "center";

      // 创建图片元素
      const imgElement = document.createElement("img");
      imgElement.src = url;
      imgElement.style.maxWidth = "80%";
      imgElement.style.maxHeight = "80%";

      // 创建关闭按钮
      const closeButton = document.createElement("button");
      closeButton.textContent = "关闭";
      closeButton.style.position = "absolute";
      closeButton.style.top = "10px";
      closeButton.style.right = "10px";
      closeButton.style.padding = "5px 10px";
      closeButton.style.backgroundColor = "#409EFF";
      closeButton.style.border = "none";
      closeButton.style.cursor = "pointer";
      closeButton.style.borderRadius = "10px";
      closeButton.style.color = "#fff";

      // 点击关闭按钮时移除弹窗
      closeButton.addEventListener("click", () => {
        document.body.removeChild(modalContainer);
        window.URL.revokeObjectURL(url); // 释放对象 URL
      });

      // 将图片和关闭按钮添加到弹窗容器中
      modalContainer.appendChild(imgElement);
      modalContainer.appendChild(closeButton);

      // 将弹窗容器添加到页面主体中
      document.body.appendChild(modalContainer);
    },
    downloadFile(url, fileName) {
      // 创建下载链接
      const link = document.createElement("a");
      link.href = url;
      link.setAttribute("download", fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    },
    handleFileSuccess(response, file, fileList) {
      // 处理文件上传成功的回调
      console.log("文件上传成功", response);
    },
    handleFileRemove(file, fileList) {
      // 处理文件移除的回调
      console.log("文件移除", file);
    },
    handleFileError(error, file, fileList) {
      // 处理文件上传失败的回调
      console.error("文件上传失败", error);
    },
  },
};
</script>

<style>
/* 可以根据需要添加样式 */
</style>

1.2 组件说明

  • el-upload 组件配置:配置了文件上传的基本参数,如上传地址、成功、移除和失败的回调函数等。
  • openFile 方法:异步方法,根据文件类型进行预览或下载。如果是图片类型,则创建一个模态框显示图片;否则,直接下载文件。
  • createImageModal 方法:创建图片预览的模态框,包括显示图片和关闭按钮。
  • downloadFile 方法:创建下载链接并进行下载。

2.注意事项

  • Blob 对象:用于处理从服务器获取的二进制数据,如图片内容。
  • 文件类型判断:通过文件后缀名判断文件类型,这里示例了图片类型的判断方式。

通过以上方法,你可以在 Vue.js 项目中利用 Element UI 的 el-upload 组件实现文件上传并根据文件类型进行预览或下载的功能。这样的实现不仅提升了用户体验,还增加了系统的交互性和可用性。

总结

到此这篇关于Vue如何实现文件预览和下载功能的前端上传组件的文章就介绍到这了,更多相关Vue文件预览和下载功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何在vue中使用jointjs过程解析

    如何在vue中使用jointjs过程解析

    这篇文章主要介绍了如何在vue中使用jointjs过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • webstorm+vue初始化项目的方法

    webstorm+vue初始化项目的方法

    今天小编就为大家分享一篇webstorm+vue初始化项目的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • vue3中如何使用ts

    vue3中如何使用ts

    这篇文章主要介绍了vue3中如何使用ts,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue实现点击复制到粘贴板

    vue实现点击复制到粘贴板

    这篇文章主要为大家详细介绍了vue实现点击复制到粘贴板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 查找Vue中下标的操作(some和findindex)

    查找Vue中下标的操作(some和findindex)

    这篇文章主要介绍了查找Vue中下标的操作(some和findindex),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vuex(多组件数据共享的Vue插件)搭建与使用

    Vuex(多组件数据共享的Vue插件)搭建与使用

    Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享,数据缓存等等,下面这篇文章主要给大家介绍了关于Vuex(多组件数据共享的Vue插件)搭建与使用的相关资料,需要的朋友可以参考下
    2022-10-10
  • vue中ref引用操作DOM元素的实现

    vue中ref引用操作DOM元素的实现

    本文主要介绍了vue中ref引用操作DOM元素的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 对vuex中getters计算过滤操作详解

    对vuex中getters计算过滤操作详解

    今天小编就为大家分享一篇对vuex中getters计算过滤操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue渲染方式render和template的区别

    vue渲染方式render和template的区别

    这篇文章主要介绍了vue渲染方式render和template的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 浅谈vue中computed属性对data属性赋值为undefined的原因

    浅谈vue中computed属性对data属性赋值为undefined的原因

    本文主要介绍了浅谈vue中computed属性对data属性赋值为undefined的原因,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论