Python 接入雨云 ROS:Boto3 上传、下载与限时分享
使用环境变量保存凭证,以路径式 S3 访问上传文件、校验下载内容并生成 15 分钟链接。
给脚本单独准备一个桶
程序要保存报表、图片或备份,可以通过 Boto3 访问雨云 ROS。创建专用桶,取得 API 端点与对应密钥;私有文件不需要开启公共访问。
下面示例在已有 Python 3 的电脑或服务器运行,上传 hello.txt,再下载到另一个文件名。推荐码为 KuZhuJi。
前往雨云选购程序文件存储 ↗
注册推荐码:KuZhuJi
安装依赖,把凭证留在运行环境
建立虚拟环境并安装 boto3。运行脚本前,在自己的终端或服务配置中设置 ROS_ENDPOINT、ROS_ACCESS_KEY、ROS_SECRET_KEY 和 ROS_BUCKET 四个环境变量。端点使用管理页提供的完整地址,不加桶名。
密钥不要写进源码和 Git 仓库。服务部署时用平台的私密变量功能,避免把凭证粘贴到公开日志。
python3 -m venv .venv
. .venv/bin/activate
python -m pip install boto3上传后下载,比较实际内容
将下面代码保存为 ros_example.py。在已配置环境变量的同一个终端运行 python ros_example.py。示例指定 s3v4 签名与路径式访问,不需要列出账号下的全部桶。
示例会创建或覆盖 tutorial/hello.txt 这个对象,以及当前目录的 hello.txt、hello-downloaded.txt 两个文件。需要保留同名文件时,先修改这些示例名称。
import os
from pathlib import Path
import boto3
from botocore.config import Config
s3 = boto3.client(
"s3",
endpoint_url=os.environ["ROS_ENDPOINT"],
aws_access_key_id=os.environ["ROS_ACCESS_KEY"],
aws_secret_access_key=os.environ["ROS_SECRET_KEY"],
config=Config(signature_version="s3v4", s3={"addressing_style": "path"}),
)
bucket = os.environ["ROS_BUCKET"]
key = "tutorial/hello.txt"
local = Path("hello.txt")
local.write_text("Hello ROS\n", encoding="utf-8")
s3.upload_file(str(local), bucket, key)
s3.download_file(bucket, key, "hello-downloaded.txt")
assert local.read_bytes() == Path("hello-downloaded.txt").read_bytes()
print("上传、下载内容一致")
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": bucket, "Key": key},
ExpiresIn=900,
)
print(url)分享链接和错误处理
最后输出的是有效期 900 秒的下载链接。拿到完整链接的人可以在有效期内下载,所以不要把它和程序日志一起公开。下载会消耗流量,上传不计入下载配额。
KeyError 提示缺少环境变量;AccessDenied 先查对应桶的凭证权限;NoSuchKey 检查对象路径;SignatureDoesNotMatch 检查端点、签名配置和本机时间。正式任务把失败记录下来并重试,成功后再清理本地文件。
