当前位置:首页 > VUE

vue实现文档上传

2026-03-26 19:14:08VUE

Vue 实现文档上传的方法

使用原生 HTML 表单和 Vue 结合

在 Vue 组件中创建一个表单,利用 HTML 的 input 元素设置 type="file" 来允许用户选择文件。通过 Vue 的 v-on 指令监听文件选择事件。

<template>
  <div>
    <input type="file" @change="handleFileUpload" />
    <button @click="uploadFile">上传文件</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0];
    },
    uploadFile() {
      if (!this.selectedFile) return;
      const formData = new FormData();
      formData.append('file', this.selectedFile);
      // 使用 axios 或其他 HTTP 客户端发送请求
      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('上传成功', response.data);
      }).catch(error => {
        console.error('上传失败', error);
      });
    }
  },
  data() {
    return {
      selectedFile: null
    };
  }
};
</script>

使用第三方库(如 Vue-Dropzone)

如果需要更丰富的上传功能(如拖拽上传、预览等),可以使用第三方库如 vue-dropzone

安装依赖:

vue实现文档上传

npm install vue2-dropzone

在 Vue 组件中使用:

<template>
  <div>
    <vue-dropzone
      ref="myVueDropzone"
      id="dropzone"
      :options="dropzoneOptions"
      @vdropzone-success="uploadSuccess"
    ></vue-dropzone>
  </div>
</template>

<script>
import vue2Dropzone from 'vue2-dropzone';
import 'vue2-dropzone/dist/vue2Dropzone.min.css';

export default {
  components: {
    vueDropzone: vue2Dropzone
  },
  data() {
    return {
      dropzoneOptions: {
        url: '/api/upload',
        thumbnailWidth: 150,
        maxFilesize: 2, // MB
        headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
      }
    };
  },
  methods: {
    uploadSuccess(file, response) {
      console.log('文件上传成功', response);
    }
  }
};
</script>

文件上传前的验证

可以在上传前对文件大小、类型等进行验证:

vue实现文档上传

methods: {
  handleFileUpload(event) {
    const file = event.target.files[0];
    const allowedTypes = ['application/pdf', 'image/jpeg', 'image/png'];
    const maxSize = 2 * 1024 * 1024; // 2MB

    if (!allowedTypes.includes(file.type)) {
      alert('请上传 PDF、JPEG 或 PNG 文件');
      return;
    }
    if (file.size > maxSize) {
      alert('文件大小不能超过 2MB');
      return;
    }
    this.selectedFile = file;
  }
}

显示上传进度

如果需要显示上传进度,可以通过 axiosonUploadProgress 实现:

uploadFile() {
  const formData = new FormData();
  formData.append('file', this.selectedFile);
  axios.post('/api/upload', formData, {
    headers: { 'Content-Type': 'multipart/form-data' },
    onUploadProgress: progressEvent => {
      const percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      console.log(percentCompleted + '%');
    }
  }).then(response => {
    console.log('上传完成', response.data);
  });
}

多文件上传

支持多文件上传时,需将 inputmultiple 属性设置为 true,并调整数据处理逻辑:

<input type="file" multiple @change="handleFileUpload" />
handleFileUpload(event) {
  this.selectedFiles = Array.from(event.target.files);
},
uploadFiles() {
  const formData = new FormData();
  this.selectedFiles.forEach(file => {
    formData.append('files[]', file);
  });
  axios.post('/api/upload-multiple', formData);
}

标签: 上传文档
分享给朋友:

相关文章

vue实现预览word文档

vue实现预览word文档

使用mammoth.js库解析Word文档 mammoth.js是一个流行的JavaScript库,专门用于将.docx文件转换为HTML。它可以直接在浏览器端运行,无需后端支持。 安装mammot…

vue java实现分片上传

vue java实现分片上传

分片上传的实现原理 分片上传是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能解决大文件上传超时、网络不稳定等问题,同时支持断点续传。 前端Vue实现 前端需要使用File API…

vue实现上传头像显示

vue实现上传头像显示

Vue 实现上传头像并显示 前端实现(Vue 3 + Element Plus) 模板部分 <template> <div class="avatar-upload">…

vue实现多图片上传

vue实现多图片上传

Vue 多图片上传实现 基本文件上传组件 创建基于<input type="file">的基础组件,支持多选: <template> <div> &l…

react实现上传

react实现上传

React 实现文件上传 在 React 中实现文件上传功能通常涉及以下几个关键步骤: 创建文件输入组件 使用 <input type="file"> 元素创建文件选择器,通过 onCh…

react实现在线文档

react实现在线文档

React 实现在线文档的方法 使用 React 实现在线文档可以通过多种方式完成,以下是几种常见的方法和工具: 使用 Markdown 和 React 结合 Markdown 是一种轻量级标记语言…