对象存储COS/OSS实战:图片存储+CDN加速全配置(附代码)

阿里云上云采购季 2核2G云服务器99元/年 续费同价

还在把图片存服务器本地?磁盘满了、带宽被吃爆是迟早的事。本文教你用腾讯云 COS 或阿里云 OSS,把图片存储和 CDN 加速一次性配好,让博客/网站飞起来。


为什么要用对象存储?

很多人刚建站,图片直接存在服务器的 /uploads 目录里,这有几个隐患:

  1. 带宽被吃死:服务器带宽只有 3~5Mbps,图片一多,页面加载卡成PPT
  2. 磁盘不够用:几千张图片轻松占满 40G 系统盘
  3. 没有冗余:服务器挂了,图片一起没了
  4. 迁移成本高:换服务器要把几个G的图片重新传一遍

对象存储的价值:
– 存储容量无限,按实际使用量付费
– 自带 CDN 加速,全国节点就近访问
– 99.999999999%(11个9)数据持久性
– 流量费用比服务器带宽便宜得多


腾讯云 COS vs 阿里云 OSS 费用对比

存储费用(标准存储)

存储量 腾讯云COS 阿里云OSS
前 50GB 免费(每月) 免费(前6个月)
50GB~500GB ¥0.118/GB/月 ¥0.12/GB/月
500GB以上 ¥0.108/GB/月 ¥0.10/GB/月

流量费用(外网下行流量)

流量 腾讯云COS 阿里云OSS
0~10GB ¥0.5/GB ¥0.5/GB
10GB+ ¥0.45/GB ¥0.45/GB

建议:搭配 CDN 回源,实际外网流量费用会大幅降低。图片站建议开 CDN,每 GB CDN 流量约 ¥0.2~0.3,比直接走 OSS/COS 便宜。


实战:腾讯云 COS 配置全流程

Step 1:创建存储桶

  1. 登录腾讯云控制台 → 对象存储 → 存储桶列表 → 创建存储桶
  2. 关键配置:
    – 地域:选离目标用户最近的(华南/华东/华北)
    – 访问权限:公有读私有写(图片需要公开访问)
    – 版本控制:可选,开了防止误删

Step 2:上传测试文件

# 安装腾讯云 CLI 工具
pip install coscmd

# 配置 SecretId 和 SecretKey(在腾讯云控制台 → 访问管理 → API密钥)
coscmd config -a AKIDxxxxxxxxxx -s xxxxxxxxxxx -b your-bucket-name -r ap-guangzhou

# 上传单个文件
coscmd upload ./test.jpg /images/test.jpg

# 上传整个目录
coscmd upload -r ./images/ /images/

# 下载文件
coscmd download /images/test.jpg ./test_download.jpg

Step 3:用 Python SDK 操作 COS

from qcloud_cos import CosConfig, CosS3Client
import sys
import logging

# 配置信息
SECRET_ID = "你的SecretId"
SECRET_KEY = "你的SecretKey"
REGION = "ap-guangzhou"
BUCKET = "your-bucket-name-1234567890"

config = CosConfig(Region=REGION, SecretId=SECRET_ID, SecretKey=SECRET_KEY)
client = CosS3Client(config)

# 上传文件
def upload_file(local_path: str, cos_path: str):
    with open(local_path, 'rb') as f:
        response = client.put_object(
            Bucket=BUCKET,
            Body=f,
            Key=cos_path,
            ContentType='image/jpeg',
            # 公开读
            ACL='public-read',
            # 缓存控制(CDN 会用到)
            CacheControl='max-age=2592000'
        )
    return f"https://{BUCKET}.cos.{REGION}.myqcloud.com/{cos_path}"

# 批量上传目录
import os

def upload_directory(local_dir: str, cos_prefix: str):
    uploaded = []
    for root, dirs, files in os.walk(local_dir):
        for filename in files:
            if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
                local_file = os.path.join(root, filename)
                # 保持目录结构
                rel_path = os.path.relpath(local_file, local_dir)
                cos_key = f"{cos_prefix}/{rel_path.replace(os.sep, '/')}"

                url = upload_file(local_file, cos_key)
                uploaded.append(url)
                print(f"✅ 已上传: {filename} → {url}")

    return uploaded

# 使用示例
urls = upload_directory("./my_images", "blog/images")
print(f"\n共上传 {len(urls)} 个文件")

# 生成预签名 URL(用于私有文件的临时访问)
def get_presigned_url(cos_path: str, expire_seconds: int = 3600):
    url = client.get_presigned_url(
        Method='GET',
        Bucket=BUCKET,
        Key=cos_path,
        Expired=expire_seconds
    )
    return url

安装依赖:

pip install cos-python-sdk-v5

实战:阿里云 OSS 配置全流程

Step 1:创建 Bucket

  1. 阿里云控制台 → 对象存储OSS → Bucket列表 → 创建Bucket
  2. 关键配置:
    – 读写权限:公共读
    – 服务端加密:可选,建议开启
    – 同城冗余:重要数据建议开启(费用x2)

Step 2:Python SDK 操作 OSS

import oss2
import os

ACCESS_KEY_ID = "你的AccessKeyId"
ACCESS_KEY_SECRET = "你的AccessKeySecret"
ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com"
BUCKET_NAME = "your-bucket-name"

auth = oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET)
bucket = oss2.Bucket(auth, ENDPOINT, BUCKET_NAME)

# 上传单个文件
def upload_to_oss(local_path: str, oss_key: str) -> str:
    with open(local_path, 'rb') as f:
        bucket.put_object(
            oss_key, 
            f,
            headers={
                'Cache-Control': 'max-age=2592000',
                'x-oss-object-acl': 'public-read'
            }
        )
    return f"https://{BUCKET_NAME}.{ENDPOINT.replace('https://', '')}/{oss_key}"

# 批量上传,支持进度回调
def upload_progress(consumed_bytes, total_bytes, ratelimit_id):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print(f'\r上传进度: {rate}%', end='')

def upload_large_file(local_path: str, oss_key: str):
    """大文件分片上传(推荐 > 100MB 的文件使用)"""
    oss2.resumable_upload(
        bucket, 
        oss_key, 
        local_path,
        progress_callback=upload_progress,
        part_size=10 * 1024 * 1024,  # 10MB 分片
        num_threads=4
    )
    print(f"\n✅ 大文件上传完成: {oss_key}")

# 列出 Bucket 中所有文件
def list_all_objects(prefix=''):
    objects = []
    for obj in oss2.ObjectIterator(bucket, prefix=prefix):
        objects.append({
            'key': obj.key,
            'size': obj.size,
            'last_modified': obj.last_modified
        })
    return objects

# 删除文件(注意!删除不可恢复)
def delete_object(oss_key: str):
    bucket.delete_object(oss_key)
    print(f"🗑️ 已删除: {oss_key}")

安装依赖:

pip install oss2

配置 CDN 加速

腾讯云 CDN + COS

  1. 进入 COS 存储桶 → 域名与传输管理 → 自定义 CDN 加速域名
  2. 添加你的域名(如 img.y1cloud.cn)
  3. 去 CDN 控制台设置缓存规则:
图片文件(.jpg/.png/.gif/.webp):缓存 30 天
CSS/JS 文件:缓存 7 天
HTML 文件:缓存 0(不缓存)
  1. DNS 解析:将 img.y1cloud.cn 添加 CNAME 记录,指向 CDN 给的 .cdn.dnsv1.com 域名
  2. 申请 SSL 证书绑定到 CDN 域名,开启 HTTPS

配置完成后,原来的访问链接:

https://your-bucket.cos.ap-guangzhou.myqcloud.com/images/photo.jpg

变成:

https://img.y1cloud.cn/images/photo.jpg

实测加速效果(华南地区用户,上海节点 COS):

访问方式 首次加载(100KB图片) 二次加载
直接 COS 域名 180~350ms 180~350ms
CDN 加速(命中缓存) 20~50ms 5~15ms

WordPress 整合 COS/OSS

腾讯云 COS 插件(推荐)

  1. 安装插件:搜索 腾讯云COS 或 Storages for COS
  2. 配置 SecretId/SecretKey/Bucket/地域
  3. 开启「本地文件不保留」(上传后自动删除本地文件)
  4. 设置 CDN 自定义域名

安装后,WordPress 媒体库上传的所有文件会自动存到 COS,无需修改代码。

阿里云 OSS 插件

搜索插件:阿里云OSS 或 OSS Uploads,配置方法类似。


图片处理进阶:自动压缩和格式转换

COS 和 OSS 都支持「图片处理」功能,通过 URL 参数实时处理图片,无需预先处理。

腾讯云 COS 图片处理示例:

# 原图
https://img.y1cloud.cn/images/photo.jpg

# 压缩质量到 80%
https://img.y1cloud.cn/images/photo.jpg?imageMogr2/quality/80

# 缩放到宽度 800px
https://img.y1cloud.cn/images/photo.jpg?imageMogr2/thumbnail/800x

# 转换为 WebP 格式(体积减少 30-50%)
https://img.y1cloud.cn/images/photo.jpg?imageMogr2/format/webp

# 组合操作:缩放+压缩+WebP
https://img.y1cloud.cn/images/photo.jpg?imageMogr2/thumbnail/800x/quality/80/format/webp

在 Nginx 或代码层统一拼接图片处理参数,博客页面图片加载速度可提升 60%+。


费用估算

以月访问量 10 万 PV、图片总存储 5GB 的博客为例:

费用项 用量 费用
标准存储 5GB ¥0.59/月
CDN 流量(平均每PV 300KB图片) ~30GB ¥9/月
请求费用 约10万次 ¥0.1/月
合计 约 ¥10/月

对比:如果用服务器 5Mbps 带宽承担这些流量,一个月带宽费用要 ¥100+,还影响网页响应速度。


总结

场景 方案
博客图床 COS/OSS + CDN自定义域名
用户上传文件 前端直传 COS/OSS(避免过服务器)
视频托管 配合云点播服务(VOD),有转码+播放器支持
静态网站托管 COS/OSS 直接托管,无需服务器

把图片从服务器迁到对象存储,是每个网站最值得做的优化之一。带宽省了、速度快了、成本低了,三赢。


关于作者

长期关注大模型应用落地与云服务器实战,专注技术在企业场景中的落地实践。

个人博客:y1cloud.cn —— 持续更新云计算、AI大模型实战教程,欢迎访问交流。

发表评论