跳到主要内容

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 仓库。服务部署时用平台的私密变量功能,避免把凭证粘贴到公开日志。

bash;使用前请核对本文前提。
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 两个文件。需要保留同名文件时,先修改这些示例名称。

text;使用前请核对本文前提。
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 检查端点、签名配置和本机时间。正式任务把失败记录下来并重试,成功后再清理本地文件。

私有文件临时分享 →

rclone 备份雨云 ROS →

本文关联资源