草庐IT

轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)

coderYYY 2023-04-20 原文

概述

  • 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,用户可通过网络随时存储和查看数据。
  • 个人账户首次开通COS可以免费领取50GB 标准存储容量包6个月(180天)的额度。
  • 本篇文章将详细介绍如何在微信小程序中使用对象存储sdk上传图片到腾讯云COS。

准备工作

初次使用 COS,建议您先了解以下基本概念:

  • 存储桶(Bucket):是对象的载体,可理解为存放对象的“容器”。一个存储桶可容纳无数个对象。
  • 对象(Object):是对象存储的基本单元,可理解为任何格式类型的数据,例如图片、文档和音视频文件等。
  • 地域(Region):是腾讯云托管机房的分布地区,对象存储 COS 的数据存放在这些地域的存储桶中。

快速入门

步骤 1-5都是前期准备(已完成的可以跳过),步骤6开始正式使用

步骤1:注册腾讯云账号

在使用腾讯云 COS 服务前,您需要先注册一个腾讯云账号。请单击下方按钮开始注册。(如果您已注册,请跳过该步骤。)

开始注册

步骤2:完成实名认证

账号注册完成后,使用该账号登录 腾讯云控制台,开始实名认证。详细操作指引请参见 实名认证介绍。(如果您已完成,请跳过该步骤。)

开始实名认证

步骤3:开通 COS 服务

腾讯云控制台 中,选择云产品 > 对象存储,进入 COS 控制台,按照界面提示开通 COS 服务。(如果您已开通,请跳过该步骤。)

开通 COS 服务

步骤4:创建存储桶

我们需要创建一个用于存放对象的存储桶:

  1. 对象存储控制台 左侧导航栏中单击存储桶列表,进入存储桶管理页。
  2. 单击创建存储桶,输入以下配置信息,其他配置保持默认即可。
    • 名称:输入存储桶名称。名称设置后不可修改。此处举例输入 examplebucket。
    • 所属地域:存储桶所属地域,选择与您业务最近的一个地区,例如广州地域。
    • 访问权限:存储桶访问权限,此处我们保持默认为“私有读写”。
  3. 单击创建,即可创建完成。

步骤5:获取密钥

访问管理控制台中的 API 密钥管理 页面里获取 APPID,并创建 SecretId、SecretKey。

步骤6:在小程序中使用对象存储sdk

1. 安装 SDK

安装小程序 SDK 有两种方式:手动安装和 npm 安装,具体安装方法如下。

  • 手动安装
    复制源码文件中的 cos-wx-sdk-v5.js 到自己小程序代码根目录下任意路径,并用相对路径引用:

(自己新建一个utils文件夹和cos-wx-sdk-v5.js文件)

var COS = require('./utils/cos-wx-sdk-v5.js')
  • npm 安装
    如果小程序代码使用了 webpack 打包,则通过 npm 安装依赖即可:
npm install cos-wx-sdk-v5

其中,程序代码使用 var COS = require('cos-wx-sdk-v5'); 进行引用;
我这里用的是手动安装的方法。

2. 开始使用

2.1 小程序域名白名单配置

小程序里请求 COS 需要登录到 微信公众平台,选择开发 > 开发设置 > 服务器域名,配置域名白名单。SDK 使用到了两个接口:

  1. cos.postObject 使用 wx.uploadFile 方法。
  2. 其他方法使用 wx.request 方法。

需要在对应白名单里,配置 COS 域名,白名单域名格式有两种:

  1. 如果是标准请求,可以配置存储桶域名作为白名单域名,例如:
    examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com
  2. 如果小程序使用的存储桶多,可以选择后缀式请求 COS,只需要在 SDK 实例化时传入ForcePathStyle: true,这种方式需要配置地域域名作为白名单,例如:cos.ap-guangzhou.myqcloud.com


把存储桶的访问域名加上

2.2 初始化

  • 引入
var COS = require('./utils/cos-wx-sdk-v5.js');
  • 初始化

通常情况下我们只需要创建一个 COS SDK 实例,然后在需要调用SDK方法的地方直接使用这个实例即可

var cos = new COS({
  ....
});

2.3 配置项

  • COS实例可以用多种配置项格式创建,官方列出的有4种(官方举例地址)前3种需要结合后端使用,也是官方比较推荐的使用方式。
  • 为了方便,我这里的方式是第四种:前端使用固定密钥计算签名,该格式适用于前端调试,若使用此格式,请避免泄露密钥
  • 这种方式无需结合后端使用,但比较不安全
// SECRETID 和 SECRETKEY 请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理
var cos = new COS({
    SecretId: 'SECRETID',
    SecretKey: 'SECRETKEY',
    SimpleUploadMethod: 'putObject', // 强烈建议,高级上传、批量上传内部对小文件做简单上传时使用putObject,sdk版本至少需要v1.3.0
});

2.4 上传到cos

wx.chooseMedia选择图片,cos.postObject把图片上传到腾讯云COS;
关键js代码:

 /* 选择文件,得到临时路径 */
    uploadImg: function () {

        var that = this;
        // chooseImage已停止维护,需使用chooseMedia选择上传
        wx.chooseMedia({
            count: 9,
            mediaType: ['image'],
            sizeType: ['original'],
            sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
            success(result) {
                console.log(result);
                that.setData({
                    imgList: result.tempFiles
                })
                // console.log(that.data.imgList);
            },

        })
    },
    // 上传到COS
    uploadIng: function () {

        for (var index in this.data.imgList) {
            var filePath = this.data.imgList[index].tempFilePath;
            var Key = filePath.substr(filePath.lastIndexOf('/') + 1); // 这里指定上传的文件名,不指定的话,上传不是图片格式
            cos.postObject({
                Bucket: '', //对象储存桶的名称
                Region: '', //所属地域
                Key: 'images/' + Key, // 存储在桶里的对象键(例如:1.jpg,a/b/test.txt)我这里是上传到存储桶上的images文件夹里
                FilePath: filePath,
                onProgress: function (info) {
                    console.log('进度条', JSON.stringify(info));
                }
            }, function (err, data) {
            // 这里我用的是回调函数的形式,也可以用promise方式
                if (err) {
                    console.log('上传失败', err);
                } else {
                    console.log('上传成功', data);
                }
            });
        }
    }

效果:


上传成功后,会返回图片地址

我们在控制台可以看到文件列表

  • 如果存储桶访问权限 为 公有读私有写,我们可以在浏览器输入这个地址,即可访问到这张图片。

  • 若是私有读写,则无法直接访问这个地址,需要通过调用cos.getObjectUrl 获取访问url

// 获取图片地址(在权限为私有读写情况下使用)
          cos.getObjectUrl({
            Bucket: '', //对象储存桶的名称
            Region: '', //所属地域
            Key: 'images/' + Key,
          }, function (err, data) {
            console.log('获取url',err || data);
          });


附:完整示例代码

关注公众号【richGirlyyy】,发消息:小程序图片云存储,即可获取demo源码;

有关轻松实现微信小程序上传多文件/图片到腾讯云对象存储COS(免费额度)的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  7. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  8. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐