结合 FormData 通过原生文件输入框实现多文件选择,结合 FormData 上传到服务器。
当前位置:首页 > VUE

vue实现多图片上传

2026-02-23 22:39:04VUE

Vue 实现多图片上传的方法

使用 <input type="file"> 结合 FormData

通过原生文件输入框实现多文件选择,结合 FormData 上传到服务器。

<template>
  <div>
    <input type="file" multiple @change="handleFileChange" accept="image/*">
    <button @click="uploadFiles">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    };
  },
  methods: {
    handleFileChange(e) {
      this.files = Array.from(e.target.files);
    },
    async uploadFiles() {
      const formData = new FormData();
      this.files.forEach(file => {
        formData.append('images[]', file);
      });

      try {
        const response = await axios.post('/api/upload', formData, {
          headers: { 'Content-Type': 'multipart/form-data' }
        });
        console.log('上传成功', response.data);
      } catch (error) {
        console.error('上传失败', error);
      }
    }
  }
};
</script>

使用第三方库 vue-upload-component

vue-upload-component 提供了更丰富的上传功能,如拖拽上传、进度显示等。

安装依赖:

vue实现多图片上传

npm install vue-upload-component

示例代码:

<template>
  <div>
    <file-upload
      multiple
      accept="image/*"
      @input-file="handleInputFile"
      @input-filter="handleInputFilter"
    ></file-upload>
  </div>
</template>

<script>
import FileUpload from 'vue-upload-component';
export default {
  components: { FileUpload },
  methods: {
    handleInputFile(newFile, oldFile) {
      if (newFile && !oldFile) {
        // 新文件添加
      }
    },
    handleInputFilter(newFile, oldFile) {
      if (newFile && !oldFile) {
        // 文件类型过滤
        if (!/\.(jpe?g|png|gif)$/i.test(newFile.name)) {
          return false;
        }
      }
    }
  }
};
</script>

图片预览功能

在上传前显示图片预览,提升用户体验。

vue实现多图片上传

<template>
  <div>
    <input type="file" multiple @change="handleFileChange" accept="image/*">
    <div v-for="(file, index) in files" :key="index">
      <img :src="file.preview" width="100">
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    };
  },
  methods: {
    handleFileChange(e) {
      this.files = Array.from(e.target.files).map(file => ({
        raw: file,
        preview: URL.createObjectURL(file)
      }));
    }
  }
};
</script>

分片上传大文件

对于大文件,可以使用分片上传减少服务器压力。

async uploadChunks(file) {
  const chunkSize = 2 * 1024 * 1024; // 2MB
  const chunks = Math.ceil(file.size / chunkSize);
  for (let i = 0; i < chunks; i++) {
    const chunk = file.slice(i * chunkSize, (i + 1) * chunkSize);
    const formData = new FormData();
    formData.append('chunk', chunk);
    formData.append('chunkIndex', i);
    formData.append('totalChunks', chunks);
    await axios.post('/api/upload-chunk', formData);
  }
}

服务器端处理

以 Node.js 为例,使用 multer 处理上传的图片。

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/api/upload', upload.array('images[]'), (req, res) => {
  console.log(req.files);
  res.json({ success: true });
});

注意事项

  • 及时释放预览图片的 URL 对象,避免内存泄漏。
  • 限制上传文件的大小和类型,防止恶意文件上传。
  • 处理上传进度和错误反馈,提升用户体验。

标签: 多图上传
分享给朋友:

相关文章

vue实现分段上传

vue实现分段上传

实现分段上传的基本思路 分段上传(分片上传)是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能提高上传稳定性、支持断点续传,并减轻服务器压力。 前端实现步骤 安装依赖 需要axio…

vue实现头像上传

vue实现头像上传

Vue 头像上传实现方法 使用 <input type="file"> 基础方法 创建文件输入控件并监听 change 事件: <template> <div&g…

js实现文件的上传

js实现文件的上传

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。HTML部分需要包含一个文件选择控件和一个提交按…

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue用户实现头像上传

vue用户实现头像上传

前端实现头像上传(Vue + Element UI) 环境准备 确保项目已安装element-ui和axios(或其他HTTP库): npm install element-ui axios 组件代…

vue实现上传头像显示

vue实现上传头像显示

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