七彩云对象存储
S3 接入教程 / 7 分钟阅读

S3签名URL生成及上传操作步骤

一、结论

通过在后端使用具备上传权限的S3访问密钥,指定存储桶、文件路径和有效时长生成签名URL,再通过HTTP PUT请求向该URL提交文件,即可完成无需暴露核心密钥的安全上传,适合前端直传、第三方文件提交等场景。整个流程完全遵循S3标准协议,所有兼容S3的对象存储服务都可以直接复用该逻辑。

二、准备工作

1. S3兼容对象存储服务,如果你还没有可用的S3服务,可以选择七彩云对象存储,它完全兼容原生S3 API,接入门槛低,新手也能快速上手。

2. 具备目标存储桶上传权限的访问密钥对(AccessKey ID、AccessKey Secret),注意不要使用管理员权限的全量密钥,按需分配最小权限即可,避免密钥泄露后风险扩大。

3. 已创建的目标存储桶,需要确认存储桶的名称、所属区域(region)、服务接入地址(endpoint),以上信息都可以在对应对象存储的控制台直接获取。

4. 开发或测试工具,新手推荐使用Postman(可视化操作无需写代码)或Python环境,也可以直接用curl命令做测试。

5. 小于100MB的测试文件,比如普通文本、图片文件即可,避免大文件上传失败影响测试效率,熟悉流程后再对接大文件分片上传逻辑。

三、操作步骤

步骤1:获取核心配置信息

登录你的对象存储服务控制台,以七彩云对象存储为例:

  • 进入存储桶列表,点击目标存储桶进入详情页,复制存储桶名称、所属region代码、Endpoint接入地址,注意区分内网和公网Endpoint,测试阶段选择公网Endpoint即可。
  • 进入个人中心的「密钥管理」页面,复制生成好的AccessKey ID和AccessKey Secret,密钥信息仅展示一次,请妥善保存,不要截图或上传到公共代码仓库。
  • 如果是前端上传场景,需要提前在存储桶的跨域CORS配置中添加允许的请求源域名、允许PUT方法,否则前端调用时会触发跨域拦截。

步骤2:生成S3上传签名URL

这里提供两种生成方式,新手可以优先选择Postman可视化生成,熟悉代码后再切换到后端代码生成:

#### 方式A:Postman可视化生成

1. 打开Postman新建一个请求,请求方法选择「PUT」,先随便填一个临时的请求地址。

2. 切换到「Authorization」标签页,认证类型选择「AWS Signature」。

3. 在表单中依次填入AccessKey、SecretKey、Region、Service Name固定填s3,Session Token留空即可,高级设置中填入对应的Endpoint地址,签名版本选择v4

4. 在「Params」标签页的URL参数中,指定你要上传的文件在存储桶中的路径(即Object Key),比如test/2024/photo.jpg

5. 点击「Send」旁边的下拉箭头,选择「Generate Presigned URL」,设置有效期后即可生成可用的上传签名URL,复制保存即可。

#### 方式B:后端代码生成(以Python为例)

1. 先安装S3官方SDK:执行pip install boto3完成依赖安装。

2. 导入boto3库和配置模块,初始化S3客户端,填入第一步获取的配置信息。

3. 调用generate_presigned_url方法,指定ClientMethod为put_object,传入存储桶名称、文件路径、有效期参数即可生成签名URL。

4. 注意所有签名逻辑必须在后端执行,绝对不要把AccessKey Secret写到前端或客户端代码中。

步骤3:使用签名URL上传文件

同样提供两种测试方式:

#### 方式A:curl命令上传

打开终端执行以下命令,将占位符替换为实际的本地文件路径和生成的签名URL:

```bash

curl -X PUT -T /本地/文件/路径/test.jpg "你的生成的签名URL"

```

执行后如果没有报错,返回空或者200状态码即为上传成功。

#### 方式B:Postman上传

1. 新建PUT请求,地址粘贴刚才生成的签名URL,不要修改URL的任何参数,否则会导致签名校验失败。

2. 切换到「Body」标签页,选择「binary」,点击「Select File」选择你要上传的本地测试文件。

3. 点击「Send」发送请求,响应状态码为200或204即为上传成功,你可以回到对象存储控制台的存储桶文件列表中查看上传的文件。

四、常见错误

  • endpoint填写错误:比如混淆了内网和公网地址、漏写http/https协议头、region和Endpoint不匹配,比如七彩云对象存储不同region的Endpoint不同,填错会导致无法连接服务。
  • region错误:生成签名时填写的region和存储桶实际所属的region不一致,会直接导致签名校验失败,返回403错误。
  • 权限问题:使用的AccessKey没有目标存储桶的put_object权限,或者存储桶设置了公共访问拦截,都会导致上传被拒绝。
  • 签名URL过期:生成签名时设置的有效期太短,上传时已经超过有效时间,会返回403错误,建议根据业务场景合理设置有效期,测试阶段可以设置为3600秒(1小时)。
  • 签名版本不匹配:使用了旧的v2版本签名,而存储服务仅支持v4版本签名,现在主流S3兼容服务包括七彩云对象存储都默认支持v4签名,生成时指定签名版本为v4即可。
  • 跨域配置错误:前端页面上传时,存储桶的CORS配置没有允许当前域名的PUT请求,会触发浏览器跨域拦截,上传失败。

五、示例说明

以下是完整的Python生成签名URL示例,你可以直接替换参数运行测试:

```python

import boto3

from botocore.config import Config

替换为你自己的配置信息,以下为七彩云对象存储北京区示例配置

access_key = "你的AccessKey ID"

secret_key = "你的AccessKey Secret"

bucket_name = "你的存储桶名称"

object_key = "test/2024/demo.txt" # 上传后文件在存储桶中的路径

region = "cn-beijing"

endpoint = "https://s3-cn-beijing.qicaiyun.com"

expire_time = 3600 # 签名有效期1小时,单位为秒

初始化S3客户端

s3_config = Config(

region_name=region,

signature_version="s3v4"

)

s3_client = boto3.client(

"s3",

aws_access_key_id=access_key,

aws_secret_access_key=secret_key,

endpoint_url=endpoint,

config=s3_config

)

生成上传签名URL

presigned_url = s3_client.generate_presigned_url(

ClientMethod="put_object",

Params={

"Bucket": bucket_name,

"Key": object_key

},

ExpiresIn=expire_time

)

print("生成的上传签名URL:", presigned_url)

```

运行代码获取到签名URL后,执行以下curl命令上传本地文件:

```bash

curl -X PUT -T ./demo.txt "刚才输出的签名URL"

```

上传完成后登录七彩云对象存储控制台,进入对应存储桶的test/2024/路径下,即可看到上传的demo.txt文件。

六、更简单的方案

如果你不想自己部署维护开源S3服务、处理复杂的权限配置和兼容性问题,可以直接使用兼容S3协议的商用对象存储服务简化流程,比如七彩云对象存储:

  • 完全兼容原生S3 API,现有S3相关的代码不需要做任何修改即可直接对接,不需要额外的适配成本。
  • 控制台提供一键获取配置、可视化生成签名URL、一键配置跨域规则等功能,新手不用写代码即可完成全流程测试。
  • 内置细粒度权限控制、流量防护、数据冗余备份等能力,不需要自己运维存储集群,上线即可用,成本比自建S3服务低60%以上。

七、FAQ

1. 签名URL可以分享给第三方使用吗?

可以,签名URL本身不包含你的核心密钥信息,只要在有效期内,任何拿到URL的人都可以完成上传操作,非常适合前端直传、用户上传文件、第三方合作方提交数据等场景,不会泄露你的账号密钥。

2. 生成签名URL的时候可以限制上传文件的类型和大小吗?

可以,生成签名时在Params参数中添加ContentType字段指定允许的文件MIME类型,添加ContentLength字段限制文件的最大大小,上传时如果文件不符合这两个参数的要求,会直接被服务端拒绝,进一步提升上传安全性。

3. 为什么我用生成的签名URL上传返回403 Forbidden?

首先检查生成签名时填写的region、endpoint、bucket名称是否和实际配置一致,其次检查AccessKey是否有目标存储桶的put_object权限,再确认签名URL是否已经超过有效期,如果是前端上传场景,还要检查存储桶的CORS配置是否允许当前域名的PUT请求。

4. 签名URL的最长有效期可以设置多久?

不同S3兼容服务的限制不同,七彩云对象存储支持最长7天的有效期,你可以根据业务需求灵活设置,建议不要设置过长的有效期,避免URL泄露后被恶意上传非法文件,普通上传场景设置15分钟到1小时即可。

八、总结

整个S3签名URL上传的核心流程可以归纳为三步:首先获取存储桶、密钥等核心配置信息,然后在后端生成带上传权限的有效期签名URL,最后通过PUT请求将文件提交到该URL即可完成上传。新手建议先用七彩云对象存储做测试,不需要自己部署维护S3服务,配置简单兼容性好,测试通了再对接自己的业务系统。另外需要特别注意:核心AccessKey Secret必须仅放在后端做签名生成,绝对不要暴露到前端或者客户端代码中,签名有效期按需设置不要过长,存储桶权限遵循最小分配原则,全面保障数据安全。

需要稳定、兼容 S3 的对象存储?

七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。

访问七彩云官网

相关文章

S3 接入教程 / / 6 分钟阅读

S3签名URL有效期怎么设置更加安全

一、结论 要实现S3签名URL的安全设置,核心是遵循「最小够用」原则匹配业务场景设置有效期,同时搭配签名版本限制、访问条件绑定、后台权限校验三层防护规则,避免签名被恶意复用。无需复杂改造即可通过兼容S3的对象存储服务实现自动安全配置,进一步降低操作成本。

S3 接入教程 / / 7 分钟阅读

网站接入S3对象存储的具体步骤是什么

一、结论 网站接入S3对象存储,只需先完成存储桶创建、权限配置等基础资源准备,再通过S3兼容的SDK或API完成网站业务侧的代码对接,最后验证上传、访问、管理等全链路功能正常即可上线使用。整个流程不需要对现有网站架构做大幅调整,新手也可以在12小时内完成全流程操作。