Vue2实现上传图片到阿里云的OSS对象存储

在 Vue 2 项目中,将图片上传到阿里云的 OSS(对象存储)需要几个步骤,包括配置阿里云 OSS、获取上传凭证、在前端进行上传操作等。以下是一个详细的实现步骤:

1. 配置阿里云 OSS

首先,你需要在阿里云 OSS 上创建一个存储桶(Bucket),并配置好相关的权限。

2. 后端获取上传凭证

由于直接暴露 OSS 的 Access Key ID 和 Access Key Secret 到前端是不安全的,所以需要通过后端服务器来获取一个临时的上传凭证(STS Token)。

以下是一个使用 Node.js 和阿里云 SDK 获取上传凭证的示例:

javascript 复制代码
const OSS = require('ali-oss');
const STS = require('ali-oss').STS;

const client = new OSS({
  region: '<your-oss-region>',
  accessKeyId: '<your-access-key-id>',
  accessKeySecret: '<your-access-key-secret>',
  sts: new STS({
    accessKeyId: '<your-access-key-id>',
    accessKeySecret: '<your-access-key-secret>',
  })
});

async function getUploadCredentials(bucketName, objectName) {
  try {
    const result = await client.stsAssumeRole('<your-sts-role-arn>', '<your-sts-session-name>', 3600);
    const stsCredentials = {
      AccessKeyId: result.credentials.AccessKeyId,
      AccessKeySecret: result.credentials.AccessKeySecret,
      SecurityToken: result.credentials.SecurityToken,
      Expiration: result.credentials.Expiration,
    };

    const policy = {
      expiration: new Date(Date.now() + 3600 * 1000).toISOString(), // 1 hour
      conditions: [
        ['content-length-range', 0, 10485760], // Limit upload size to 10MB
        ['starts-with', '$key', objectName],
      ],
    };

    const postObject = await client.postObject(bucketName, objectName, policy);

    return {
      ...stsCredentials,
      ...postObject,
    };
  } catch (error) {
    console.error('Error getting upload credentials:', error);
    throw error;
  }
}

// Example usage:
getUploadCredentials('<your-bucket-name>', '${filename}').then(credentials => {
  console.log(credentials);
}).catch(error => {
  console.error('Error:', error);
});

3. 前端 Vue 2 实现上传

在 Vue 2 项目中,你可以使用 Axios 或 Fetch 来请求后端接口获取上传凭证,然后使用这些凭证进行文件上传。

以下是一个 Vue 组件的示例:

javascript 复制代码
<template>
  <div>
    <input type="file" @change="handleFileChange" />
    <button @click="uploadFile">Upload</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      file: null,
      uploadCredentials: null,
    };
  },
  methods: {
    async handleFileChange(event) {
      this.file = event.target.files[0];
    },
    async fetchUploadCredentials() {
      try {
        const response = await axios.get('/api/get-oss-credentials'); // 替换为你的后端接口
        this.uploadCredentials = response.data;
      } catch (error) {
        console.error('Error fetching upload credentials:', error);
      }
    },
    async uploadFile() {
      if (!this.file || !this.uploadCredentials) {
        alert('Please select a file and fetch credentials first.');
        return;
      }

      const formData = new FormData();
      formData.append('key', this.uploadCredentials.key);
      formData.append('OSSAccessKeyId', this.uploadCredentials.AccessKeyId);
      formData.append('policy', this.uploadCredentials.policy);
      formData.append('Signature', this.uploadCredentials.signature);
      formData.append('success_action_status', '200');
      formData.append('file', this.file);

      try {
        const response = await axios.post(this.uploadCredentials.uploadUrl, formData, {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        });
        console.log('Upload successful:', response.data);
      } catch (error) {
        console.error('Error uploading file:', error);
      }
    },
  },
  async mounted() {
    // Fetch upload credentials when the component is mounted
    await this.fetchUploadCredentials();
  },
};
</script>
4. 注意事项
  1. 安全性 :确保你的后端接口 /api/get-oss-credentials 是安全的,并且只有经过身份验证的用户才能访问。
  2. CORS 配置:在阿里云 OSS 的 Bucket 配置中,配置 CORS(跨域资源共享),允许你的前端域名进行访问。
  3. 错误处理:在实际项目中,应添加更多的错误处理和用户提示。

通过以上步骤,你就可以在 Vue 2 项目中实现从前端上传图片到阿里云 OSS 对象存储。

相关推荐
栀椩37 分钟前
electron编写一个macOS风格的桌面应用
javascript·macos·electron
姚永强2 小时前
登录系统网址作业
开发语言·前端·javascript
努力挣钱的小鑫2 小时前
【Vue】vue3 video 保存视频进度,每次进入加载上次的视频进度
前端·javascript·音视频
明月看潮生2 小时前
青少年编程与数学 02-006 前端开发框架VUE 25课题、UI数据
javascript·vue.js·ui·青少年编程·编程与数学
黄团团2 小时前
Vue2+OpenLayers实现车辆开始、暂停、重置行驶轨迹动画(提供Gitee源码)
前端·javascript·数据库·vue.js·gitee·html
Judy16233 小时前
Vue 实现当前页面刷新的几种方法
前端·javascript·vue.js
芳草萋萋鹦鹉洲哦3 小时前
【element plus】虚拟dom表格中cellRenderer如何使用v-for循环渲染item
前端·javascript·elementui·虚拟dom表格
图扑软件3 小时前
智慧充电桩可视化管理提升能源效率
前端·javascript·人工智能·能源·数字孪生·可视化·充电桩
Lysun0013 小时前
vue3里面,事件触发一次,方法执行多次
javascript·vue.js·elementui·element-plus
♟彦♟3 小时前
web-前端小实验8
开发语言·前端·javascript