怎么使用vue+elementUI实现多文件上传与预览功能

发布时间:2022-08-17 15:42:50 作者:iii
来源:亿速云 阅读:1376

怎么使用Vue+ElementUI实现多文件上传与预览功能

目录

  1. 引言
  2. 项目初始化
  3. ElementUI 文件上传组件
  4. 实现多文件上传
  5. 文件上传前的处理
  6. 文件上传进度条
  7. 文件上传成功后的处理
  8. 文件预览功能
  9. 文件删除功能
  10. 文件上传的限制
  11. 文件上传的校验
  12. 文件上传的错误处理
  13. 文件上传的优化
  14. 总结

引言

在现代Web应用中,文件上传是一个常见的功能需求。无论是上传图片、文档还是其他类型的文件,用户都需要一个简单易用的界面来完成这一操作。Vue.js 流行的前端框架,结合 ElementUI 组件库,可以轻松实现多文件上传与预览功能。

本文将详细介绍如何使用 Vue.js 和 ElementUI 实现多文件上传与预览功能。我们将从项目初始化开始,逐步实现文件上传、预览、删除等功能,并探讨如何优化和增强用户体验。

项目初始化

首先,我们需要创建一个新的 Vue.js 项目。如果你还没有安装 Vue CLI,可以通过以下命令进行安装:

npm install -g @vue/cli

然后,创建一个新的 Vue 项目:

vue create vue-file-upload

在项目创建过程中,选择默认配置或手动选择需要的特性。项目创建完成后,进入项目目录并安装 ElementUI:

cd vue-file-upload
npm install element-ui

接下来,在 main.js 中引入 ElementUI:

import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.use(ElementUI);

new Vue({
  render: h => h(App),
}).$mount('#app');

ElementUI 文件上传组件

ElementUI 提供了一个强大的文件上传组件 el-upload,我们可以使用它来实现文件上传功能。el-upload 组件支持多种上传方式,包括手动上传、自动上传、多文件上传等。

基本使用

首先,我们在 App.vue 中添加一个基本的文件上传组件:

<template>
  <div id="app">
    <el-upload
      action="https://jsonplaceholder.typicode.com/posts/"
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :before-upload="beforeUpload"
      :on-success="handleSuccess"
      :on-error="handleError"
      :on-progress="handleProgress"
      multiple
      :limit="3"
      :on-exceed="handleExceed"
      :file-list="fileList">
      <el-button type="primary">点击上传</el-button>
    </el-upload>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fileList: []
    };
  },
  methods: {
    handlePreview(file) {
      console.log('预览文件:', file);
    },
    handleRemove(file, fileList) {
      console.log('删除文件:', file, fileList);
    },
    beforeUpload(file) {
      console.log('上传前处理:', file);
      return true;
    },
    handleSuccess(response, file, fileList) {
      console.log('上传成功:', response, file, fileList);
    },
    handleError(err, file, fileList) {
      console.log('上传失败:', err, file, fileList);
    },
    handleProgress(event, file, fileList) {
      console.log('上传进度:', event, file, fileList);
    },
    handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

在这个例子中,我们使用了 el-upload 组件的基本配置:

实现多文件上传

在上面的例子中,我们已经实现了多文件上传的基本功能。用户可以选择多个文件进行上传,并且可以预览和删除已上传的文件。

文件上传前的处理

在文件上传之前,我们可能需要对文件进行一些处理,例如检查文件类型、文件大小等。我们可以通过 before-upload 钩子函数来实现这些功能。

beforeUpload(file) {
  const isJPG = file.type === 'image/jpeg';
  const isPNG = file.type === 'image/png';
  const isLt2M = file.size / 1024 / 1024 < 2;

  if (!isJPG && !isPNG) {
    this.$message.error('上传文件只能是 JPG/PNG 格式!');
    return false;
  }
  if (!isLt2M) {
    this.$message.error('上传文件大小不能超过 2MB!');
    return false;
  }
  return true;
}

在这个例子中,我们限制了上传文件的类型只能是 JPG 或 PNG 格式,并且文件大小不能超过 2MB。如果文件不符合要求,我们会提示用户并阻止文件上传。

文件上传进度条

为了提升用户体验,我们可以显示文件上传的进度条。ElementUI 的 el-upload 组件已经内置了进度条功能,我们只需要在 on-progress 钩子函数中处理进度信息即可。

handleProgress(event, file, fileList) {
  console.log('上传进度:', event, file, fileList);
}

在实际应用中,我们可以将进度信息显示在页面上,或者使用 ElementUI 的 el-progress 组件来显示进度条。

文件上传成功后的处理

文件上传成功后,我们可能需要对上传的文件进行一些处理,例如将文件信息保存到数据库中,或者更新页面上的文件列表。我们可以通过 on-success 钩子函数来实现这些功能。

handleSuccess(response, file, fileList) {
  console.log('上传成功:', response, file, fileList);
  this.fileList = fileList;
}

在这个例子中,我们将上传成功后的文件列表保存到 fileList 中,以便在页面上显示已上传的文件。

文件预览功能

文件预览功能是文件上传组件的一个重要特性。用户在上传文件后,可能需要查看文件的内容。我们可以通过 on-preview 钩子函数来实现文件预览功能。

handlePreview(file) {
  console.log('预览文件:', file);
  window.open(file.url);
}

在这个例子中,我们简单地通过 window.open 打开文件的 URL 来实现文件预览。对于图片文件,我们可以使用 el-image 组件来显示图片预览。

<template>
  <div id="app">
    <el-upload
      action="https://jsonplaceholder.typicode.com/posts/"
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :before-upload="beforeUpload"
      :on-success="handleSuccess"
      :on-error="handleError"
      :on-progress="handleProgress"
      multiple
      :limit="3"
      :on-exceed="handleExceed"
      :file-list="fileList">
      <el-button type="primary">点击上传</el-button>
    </el-upload>

    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" alt="">
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fileList: [],
      dialogVisible: false,
      dialogImageUrl: ''
    };
  },
  methods: {
    handlePreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    handleRemove(file, fileList) {
      console.log('删除文件:', file, fileList);
    },
    beforeUpload(file) {
      console.log('上传前处理:', file);
      return true;
    },
    handleSuccess(response, file, fileList) {
      console.log('上传成功:', response, file, fileList);
      this.fileList = fileList;
    },
    handleError(err, file, fileList) {
      console.log('上传失败:', err, file, fileList);
    },
    handleProgress(event, file, fileList) {
      console.log('上传进度:', event, file, fileList);
    },
    handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
    }
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

在这个例子中,我们使用了 el-dialog 组件来显示图片预览。当用户点击文件预览时,会弹出一个对话框显示图片内容。

文件删除功能

文件删除功能是文件上传组件的另一个重要特性。用户在上传文件后,可能需要删除不需要的文件。我们可以通过 on-remove 钩子函数来实现文件删除功能。

handleRemove(file, fileList) {
  console.log('删除文件:', file, fileList);
  this.fileList = fileList;
}

在这个例子中,我们将删除后的文件列表保存到 fileList 中,以便在页面上更新已上传的文件列表。

文件上传的限制

在实际应用中,我们可能需要对文件上传进行一些限制,例如限制文件类型、文件大小、文件数量等。我们可以通过 before-upload 钩子函数和 limit 属性来实现这些限制。

beforeUpload(file) {
  const isJPG = file.type === 'image/jpeg';
  const isPNG = file.type === 'image/png';
  const isLt2M = file.size / 1024 / 1024 < 2;

  if (!isJPG && !isPNG) {
    this.$message.error('上传文件只能是 JPG/PNG 格式!');
    return false;
  }
  if (!isLt2M) {
    this.$message.error('上传文件大小不能超过 2MB!');
    return false;
  }
  return true;
}

在这个例子中,我们限制了上传文件的类型只能是 JPG 或 PNG 格式,并且文件大小不能超过 2MB。如果文件不符合要求,我们会提示用户并阻止文件上传。

文件上传的校验

除了文件类型和文件大小的限制外,我们可能还需要对文件内容进行校验。例如,我们可能需要检查图片的宽高是否符合要求。我们可以通过 before-upload 钩子函数来实现这些校验。

beforeUpload(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = (e) => {
      const img = new Image();
      img.onload = () => {
        const width = img.width;
        const height = img.height;
        if (width !== 800 || height !== 600) {
          this.$message.error('图片尺寸必须是 800x600!');
          reject();
        } else {
          resolve();
        }
      };
      img.src = e.target.result;
    };
    reader.readAsDataURL(file);
  });
}

在这个例子中,我们使用 FileReader 读取文件内容,并通过 Image 对象获取图片的宽高。如果图片的宽高不符合要求,我们会提示用户并阻止文件上传。

文件上传的错误处理

文件上传过程中可能会遇到各种错误,例如网络错误、服务器错误等。我们可以通过 on-error 钩子函数来处理这些错误。

handleError(err, file, fileList) {
  console.log('上传失败:', err, file, fileList);
  this.$message.error('文件上传失败,请重试!');
}

在这个例子中,我们简单地提示用户文件上传失败,并建议用户重试。在实际应用中,我们可能需要根据具体的错误类型进行不同的处理。

文件上传的优化

为了提升文件上传的性能和用户体验,我们可以对文件上传进行一些优化。例如,我们可以使用分片上传、断点续传等技术来提升上传速度和稳定性。

分片上传

分片上传是将大文件分割成多个小文件进行上传的技术。通过分片上传,我们可以提升上传速度,并且在上传过程中出现错误时可以只重传失败的分片,而不需要重新上传整个文件。

beforeUpload(file) {
  const chunkSize = 1 * 1024 * 1024; // 1MB
  const chunks = Math.ceil(file.size / chunkSize);
  let currentChunk = 0;

  const uploadChunk = () => {
    const start = currentChunk * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const formData = new FormData();
    formData.append('file', chunk);
    formData.append('chunk', currentChunk);
    formData.append('chunks', chunks);
    formData.append('name', file.name);

    return axios.post('https://jsonplaceholder.typicode.com/posts/', formData)
      .then(response => {
        currentChunk++;
        if (currentChunk < chunks) {
          return uploadChunk();
        } else {
          return response;
        }
      });
  };

  return uploadChunk();
}

在这个例子中,我们将文件分割成 1MB 的分片,并使用 axios 进行分片上传。每次上传一个分片后,我们会检查是否还有未上传的分片,如果有则继续上传,直到所有分片上传完成。

断点续传

断点续传是在文件上传过程中出现错误时,能够从中断的地方继续上传的技术。通过断点续传,我们可以避免重新上传已经上传成功的部分,从而提升上传效率。

beforeUpload(file) {
  const chunkSize = 1 * 1024 * 1024; // 1MB
  const chunks = Math.ceil(file.size / chunkSize);
  let currentChunk = 0;

  const uploadChunk = () => {
    const start = currentChunk * chunkSize;
    const end = Math.min(start + chunkSize, file.size);
    const chunk = file.slice(start, end);

    const formData = new FormData();
    formData.append('file', chunk);
    formData.append('chunk', currentChunk);
    formData.append('chunks', chunks);
    formData.append('name', file.name);

    return axios.post('https://jsonplaceholder.typicode.com/posts/', formData)
      .then(response => {
        currentChunk++;
        if (currentChunk < chunks) {
          return uploadChunk();
        } else {
          return response;
        }
      })
      .catch(error => {
        console.log('上传失败:', error);
        return uploadChunk();
      });
  };

  return uploadChunk();
}

在这个例子中,我们在上传过程中捕获错误,并在错误发生时重新上传当前分片。通过这种方式,我们可以实现断点续传的功能。

总结

通过本文的介绍,我们详细讲解了如何使用 Vue.js 和 ElementUI 实现多文件上传与预览功能。我们从项目初始化开始,逐步实现了文件上传、预览、删除等功能,并探讨了如何优化和增强用户体验。

在实际应用中,文件上传功能可能会更加复杂,例如需要支持分片上传、断点续传、文件校验等。通过本文的学习,相信你已经掌握了如何使用 Vue.js 和 ElementUI 实现这些功能,并能够在实际项目中灵活应用。

希望本文对你有所帮助,祝你在前端开发的道路上越走越远!

推荐阅读:
  1. 附件预览功能
  2. 使用vue实现图片上传预览功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

elementui vue

上一篇:批处理命令call和start怎么应用

下一篇:Java类加载器与双亲委派机制怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》