引言

一、准备工作

在开始之前,确保你已经安装了Node.js和npm,并且已经通过npm安装了Vue CLI。接下来,我们可以创建一个新的Vue项目:

vue create photo-upload-app

进入项目目录并启动开发服务器:

cd photo-upload-app
npm run serve

二、基础照片上传

2.1 创建上传组件

首先,我们创建一个名为PhotoUpload.vue的组件,用于处理照片上传的逻辑。

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadPhoto">上传照片</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      photoFile: null,
    };
  },
  methods: {
    handleFileChange(event) {
      this.photoFile = event.target.files[0];
    },
    uploadPhoto() {
      if (!this.photoFile) {
        alert("请选择一张照片!");
        return;
      }
      const formData = new FormData();
      formData.append("photo", this.photoFile);

      // TODO: 实现上传逻辑
    },
  },
};
</script>

2.2 实现上传逻辑

在上传方法uploadPhoto中,我们将使用FormData对象来构建一个表单数据,然后使用fetch API将数据发送到服务器。

uploadPhoto() {
  if (!this.photoFile) {
    alert("请选择一张照片!");
    return;
  }
  const formData = new FormData();
  formData.append("photo", this.photoFile);

  fetch("upload-url", {
    method: "POST",
    body: formData,
  })
    .then((response) => response.json())
    .then((data) => {
      console.log("上传成功!", data);
    })
    .catch((error) => {
      console.error("上传失败!", error);
    });
},

确保将upload-url替换为你的服务器上传地址。

三、图片预览

为了提升用户体验,我们可以在用户选择照片后立即显示一个预览。

<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadPhoto">上传照片</button>
    <img v-if="previewUrl" :src="previewUrl" alt="Photo Preview" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      photoFile: null,
      previewUrl: null,
    };
  },
  methods: {
    handleFileChange(event) {
      const file = event.target.files[0];
      if (file) {
        this.photoFile = file;
        const reader = new FileReader();
        reader.onload = (e) => {
          this.previewUrl = e.target.result;
        };
        reader.readAsDataURL(file);
      }
    },
    uploadPhoto() {
      // ... 上传逻辑
    },
  },
};
</script>

四、处理大文件上传

上传大文件时,应考虑将文件分割成小块,分批次上传,以避免浏览器崩溃。

uploadPhoto() {
  if (!this.photoFile) {
    alert("请选择一张照片!");
    return;
  }
  const chunkSize = 1 * 1024 * 1024; // 1MB
  const chunks = Math.ceil(this.photoFile.size / chunkSize);

  for (let i = 0; i < chunks; i++) {
    const formData = new FormData();
    const chunk = this.photoFile.slice(i * chunkSize, (i + 1) * chunkSize);
    formData.append("photo", chunk);
    formData.append("chunk", i);
    formData.append("chunks", chunks);

    fetch("upload-url", {
      method: "POST",
      body: formData,
    })
      .then((response) => response.json())
      .then((data) => {
        console.log("Chunk " + i + " uploaded successfully!");
      })
      .catch((error) => {
        console.error("Chunk " + i + " upload failed!", error);
      });
  }
},

五、总结

通过以上步骤,你可以在Vue.js中实现照片上传功能。从基础的照片选择和上传到高级的大文件处理,这些技巧将帮助你构建一个健壮且用户友好的照片上传功能。记住,实践是学习的关键,不断尝试和改进你的代码,你会逐渐成为一名Vue.js照片上传的专家。