返回

Vue3 + Typescript:七牛云存储文件上传指南

前端

前言

在现代 Web 开发中,文件上传功能是必不可少的。它允许用户将文件上传到服务器,以便进行存储、处理或共享。七牛云存储是一个流行的文件存储服务,它提供了可靠、安全且经济高效的文件存储解决方案。

七牛云存储简介

七牛云存储是一个对象存储服务,它允许用户以对象的形式存储文件。对象存储是一种简单、可扩展且经济高效的文件存储方式。七牛云存储提供多种存储类型,包括标准存储、低频存储和归档存储,以满足不同场景下的存储需求。

七牛云存储配置

在使用七牛云存储之前,您需要先注册一个七牛云账号并创建存储空间。您可以在七牛云官网上找到详细的注册和创建存储空间的步骤。

Vue3 + Typescript 项目集成七牛云存储

  1. 安装 qiniu-js SDK
npm install qiniu-js --save
  1. 在 Vue3 项目中创建一个名为 qiniu.js 的文件,并添加以下代码:
import { Upload, Button } from 'ant-design-vue';
import { ref } from 'vue';
import { request } from 'umi-request';

const accessKey = 'YOUR_ACCESS_KEY';
const secretKey = 'YOUR_SECRET_KEY';
const bucketName = 'YOUR_BUCKET_NAME';

const qiniu = new QiniuJsSDK.UploadManager({
  region: 'YOUR_REGION', // 七牛云存储区域
  uptokenUrl: '/api/qiniu/token', // 获取七牛云上传凭证的接口
});

const state = ref({
  fileList: [],
  loading: false,
});

const handleUpload = () => {
  state.loading = true;
  const formData = new FormData();
  fileList.forEach((file) => {
    formData.append('file', file.originFileObj);
  });

  request('/api/qiniu/upload', {
    method: 'POST',
    data: formData,
  }).then((res) => {
    if (res.code === 0) {
      state.loading = false;
      state.fileList = [];
      message.success('文件上传成功');
    } else {
      message.error('文件上传失败');
    }
  });
};

export default {
  components: {
    Upload,
    Button,
  },
  setup() {
    return {
      ...state,
      handleUpload,
    };
  },
};
  1. 在 Vue3 项目中创建一个名为 api/qiniu/token.js 的文件,并添加以下代码:
import { getAuth } from 'firebase/auth';

const auth = getAuth();

export default async (req, res) => {
  if (req.method === 'GET') {
    const currentUser = auth.currentUser;
    if (currentUser) {
      const token = await currentUser.getIdToken();
      res.json({
        code: 0,
        data: {
          token,
        },
      });
    } else {
      res.json({
        code: 1,
        message: '请先登录',
      });
    }
  } else {
    res.status(405).end();
  }
};
  1. 在 Vue3 项目中创建一个名为 api/qiniu/upload.js 的文件,并添加以下代码:
import { qiniu } from 'qiniu-js';

export default async (req, res) => {
  if (req.method === 'POST') {
    const { token, file } = req.body;
    const uptoken = new QiniuJsSDK.UpToken({
      token,
    });
    const key = `${Date.now()}-${file.name}`;
    const options = {
      mimeType: file.type,
    };
    try {
      await qiniu.putFile(uptoken, key, file, options);
      res.json({
        code: 0,
        data: {
          url: `https://${bucketName}.qiniucdn.com/${key}`,
        },
      });
    } catch (error) {
      res.json({
        code: 1,
        message: error.message,
      });
    }
  } else {
    res.status(405).end();
  }
};
  1. 在 Vue3 项目中创建一个名为 App.vue 的文件,并添加以下代码:
<template>
  <div>
    <Upload
      action="/api/qiniu/upload"
      listType="picture-card"
      fileList={fileList}
      onPreview={handlePreview}
      onRemove={handleRemove}
      headers={{
        Authorization: `Bearer ${token}`,
      }}
    >
      <Button icon="upload">选择文件</Button>
    </Upload>
    <Button type="primary" loading={loading} onClick={handleUpload}>上传文件</Button>
  </div>
</template>

<script>
import { Upload, Button } from 'ant-design-vue';
import { ref } from 'vue';
import { request } from 'umi-request';
import { qiniu } from 'qiniu-js';

const accessKey = 'YOUR_ACCESS_KEY';
const secretKey = 'YOUR_SECRET_KEY';
const bucketName = 'YOUR_BUCKET_NAME';

const qiniu = new QiniuJsSDK.UploadManager({
  region: 'YOUR_REGION', // 七牛云存储区域
  uptokenUrl: '/api/qiniu/token', // 获取七牛云上传凭证的接口
});

const state = ref({
  fileList: [],
  loading: false,
});

const handlePreview = (file) => {
  console.log(file);
};

const handleRemove = (file) => {
  const index = fileList.indexOf(file);
  fileList.splice(index, 1);
};

const handleUpload = () => {
  state.loading = true;
  const formData = new FormData();
  fileList.forEach((file) => {
    formData.append('file', file.originFileObj);
  });

  request('/api/qiniu/upload', {
    method: 'POST',
    data: formData,
  }).then((res) => {
    if (res.code === 0) {
      state.loading = false;
      state.fileList = [];
      message.success('文件上传成功');
    } else {
      message.error('文件上传失败');
    }
  });
};

export default {
  components: {
    Upload,
    Button,
  },
  setup() {
    return {
      ...state,
      handlePreview,
      handleRemove,
      handleUpload,
    };
  },
};
</script>

<style>
.ant-upload-list-picture-card {
  width: 100%;
}
</style>

结语

在本文中,我们介绍了如何在 Vue3 和 Typescript 项目中集成七牛云存储,实现文件上传功能。我们详细介绍了七牛云存储的配置和使用,并提供了详细的代码示例。希望本指南能帮助您轻松实现文件上传功能。