前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >腾讯云 COS 文件上传后下载

腾讯云 COS 文件上传后下载

原创
作者头像
dandelion1990
发布2024-01-05 20:01:41
5950
发布2024-01-05 20:01:41
举报

上一篇讲了如何通过 Web 直传文件到 COS,在其基础上介绍上传后如何下载文件

后端 STS 服务

首先后端的 STS 服务需要改造一下,增加查询下载 URL 的权限

代码语言:go
复制
{
    Action: []string{
        // 下载操作
        "name/cos:GetObject",
    },
    Effect: "allow",
    Resource: []string{
        "qcs::cos:ap-guangzhou:uid/" + appId + ":" + bucket + "/*",
    },
    Condition: map[string]map[string]interface{}{},
},

其他权限列表请可以看:COS API 授权策略使用指引

前端 Demo 改造

参考Javascript SDK,上传后通过 SDK 得到访问 URL,可以在页面展示或者下载

代码语言:vue
复制
<template>
  <div>
    <div>
      <input type="file" @change="uploadImage" ref="imageInput" />
      <button @click="submitImage">Upload Image</button>
      <button v-if="imageUrl" @click="downloadImage">Download Image</button>
    </div>
    <div>
      <img v-if="imageUrl" :src="imageUrl" alt="Description of image ">
    </div>
  </div>
</template>
  
<script>
import COS from 'cos-js-sdk-v5';
const bucket = ${bucket};
const region = ${region};

export default {
  data() {
    return {
      imageFile: null,
      cos: null,
      imageUrl: null,
      imageKey: null,
      tmpSecretId: "",
      tmpSecretKey: "",
      sessionToken: "",
    };
  },
  methods: {
    uploadImage(event) {
      this.imageFile = event.target.files && event.target.files[0];
    },
    submitImage() {
      if (!this.imageFile) {
        alert("Please choose an image to upload.");
        return;
      }
      this.initCOS();
      this.uploadToCOS();
    },
    initCOS() {
      this.cos = new COS({
        getAuthorization: function (options, callback) {
          const url = 'http://${host}:8080/credentials'
          const xhr = new XMLHttpRequest()
          let data = null
          let credentials = null
          xhr.open('GET', url, true)
          xhr.onload = function (e) {
            try {
              data = JSON.parse(e.target.responseText);
              credentials = data.credentials;
            } catch (e) {
              console.log(e)
            }
            if (!data || !credentials) {
              return console.error('credentials invalid:\n' + JSON.stringify(data, null, 2))
            }
            callback({
              TmpSecretId: credentials.tmpSecretId,
              TmpSecretKey: credentials.tmpSecretKey,
              SecurityToken: credentials.sessionToken,
              StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
              ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000000
            })
          }
          xhr.send();
        }
      })
    },
    uploadToCOS() {
      const key = `test/${Date.now()}_${this.imageFile.name}`;
      this.cos.uploadFile(
        {
          Bucket: bucket,
          Region: region,
          Key: key,
          StorageClass: "STANDARD",
          Body: this.imageFile,
        },
        (err) => {
          if (err) {
            console.error("Error uploading image:", err);
            alert("Error uploading image.");
          } else {
            this.imageKey = key;
            this.getImageUrl()
            alert("Image uploaded successfully.");
            this.$refs.imageInput.value = null;
            this.imageFile = null;
          }
        }
      );
    },

    getImageUrl() {
      let that = this
      this.cos.getObjectUrl({
        Bucket: bucket,
        Region: region,
        Key: this.imageKey,
      }, function (err, data) {
        if (err) return console.log(err);
        /* 通过指定 response-content-disposition=attachment 实现强制下载 */
        const downloadUrl = data.Url + (data.Url.indexOf('?') > -1 ? '&' : '?') + 'response-content-disposition=attachment';
        /* 可拼接 filename 来实现下载时重命名 */
        /* downloadUrl += ';filename=myname'; */
        // (推荐使用 window.open()方式)这里是新窗口打开 url,如果需要在当前窗口打开,可以使用隐藏的 iframe 下载,或使用 a 标签 download 属性协助下载
        that.imageUrl = downloadUrl
        console.log("Image uploaded successfully. URL:", that.imageUrl);
      })
    },
    downloadImage() {
      const link = document.createElement("a");
      link.href = this.imageUrl;
      link.download = this.imageUrl.split("/").pop();
      link.click();
    },
  },
};
</script>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 后端 STS 服务
  • 前端 Demo 改造
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档