还在把图片存服务器本地?磁盘满了、带宽被吃爆是迟早的事。本文教你用腾讯云 COS 或阿里云 OSS,把图片存储和 CDN 加速一次性配好,让博客/网站飞起来。
为什么要用对象存储?
很多人刚建站,图片直接存在服务器的 /uploads 目录里,这有几个隐患:
- 带宽被吃死:服务器带宽只有 3~5Mbps,图片一多,页面加载卡成PPT
- 磁盘不够用:几千张图片轻松占满 40G 系统盘
- 没有冗余:服务器挂了,图片一起没了
- 迁移成本高:换服务器要把几个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:创建存储桶
- 登录腾讯云控制台 → 对象存储 → 存储桶列表 → 创建存储桶
- 关键配置:
– 地域:选离目标用户最近的(华南/华东/华北)
– 访问权限:公有读私有写(图片需要公开访问)
– 版本控制:可选,开了防止误删
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
- 阿里云控制台 → 对象存储OSS → Bucket列表 → 创建Bucket
- 关键配置:
– 读写权限:公共读
– 服务端加密:可选,建议开启
– 同城冗余:重要数据建议开启(费用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
- 进入 COS 存储桶 → 域名与传输管理 → 自定义 CDN 加速域名
- 添加你的域名(如
img.y1cloud.cn) - 去 CDN 控制台设置缓存规则:
图片文件(.jpg/.png/.gif/.webp):缓存 30 天
CSS/JS 文件:缓存 7 天
HTML 文件:缓存 0(不缓存)
- DNS 解析:将
img.y1cloud.cn添加 CNAME 记录,指向 CDN 给的.cdn.dnsv1.com域名 - 申请 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 插件(推荐)
- 安装插件:搜索
腾讯云COS或Storages for COS - 配置 SecretId/SecretKey/Bucket/地域
- 开启「本地文件不保留」(上传后自动删除本地文件)
- 设置 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大模型实战教程,欢迎访问交流。
