溯仑智算
溯仑智算 SU.RUN开发者文档
获取接入支持
溯仑智算
溯仑智算 SU.RUN
开发者文档
开始使用
文档中心
阅读路径、接入顺序与专题总览
存储接入快速开始
第一次接入时优先阅读
存储接入总览
能力边界、使用路径与整体说明
本地配置与验证指南
在本地完成示例接口与最小验证
上传与下载
授权上传指南
浏览器、App 与客户端上传方式
授权下载指南
受控下载、权限判断与短时授权
前端直传安全规范
长期密钥保护与权限边界
大文件上传实战
大文件上传、重试与断点续传
规划与治理
文件路径命名规范
存储桶、路径、目录与归档规则
自定义域名接入
品牌化访问、证书与上线准备
接口说明
服务端接入方式、鉴权边界与返回结构
最小后端接入示例
上传下载授权与确认入库的完整串联
代码示例
JavaScript、Python 与 Go 接入示例
AI 与工作流
AI 环境接入说明
常见 AI 环境的接入说明
AI 训练数据与结果回写规范
模型、数据集、日志与输出治理
排障与帮助
错误码与问题排查
常见异常定位与恢复建议
接入常见问题总览
按角色整理的常见问题说明
支持中心
获取接入支持
获取接入支持
开始使用
文档中心存储接入快速开始存储接入总览本地配置与验证指南
上传与下载
授权上传指南授权下载指南前端直传安全规范大文件上传实战
规划与治理
文件路径命名规范自定义域名接入接口说明最小后端接入示例代码示例
AI 与工作流
AI 环境接入说明AI 训练数据与结果回写规范
排障与帮助
错误码与问题排查接入常见问题总览
当前文档
JavaScript、Python 与 Go 接入示例
文档中心

SDK 代码示例

接入 SDK 时,真正影响后续维护成本的不是几行初始化代码,而是是否在一开始就把密钥、桶名、文件路径和权限边界梳理清楚。下面这些示例可直接作为项目起步模板。

示例支持
support@su.run

SDK 集成 / 服务端签名 / 脚本迁移 / 语言栈适配

怎么使用这篇文档

已经拿到接入域名和访问密钥时,本页即可直接用于落地代码。它不只是展示几段 SDK 片段,而是说明哪种语言适合什么场景、初始化代码应如何收口、前端上传为何必须走服务端签名,以及何时应考虑分段上传。

建议先选择一门最贴近现有业务栈的语言,把最小上传和下载跑通,再把这里的服务封装方式、路径规划和安全说明纳入项目规范。

选型建议
JavaScript / TypeScript

适合 Next.js、Node.js、BFF、后台管理系统和自动化脚本。当前后端主力栈以 Web 为主时,这通常是第一选择。

Python

适合数据清洗、AI 训练、批处理、媒体管线、知识库任务。存储服务更多被模型、脚本和任务机访问时,Python 会更顺手。

Go

适合高并发服务、网关、中间层和内部工具。对高性能和部署稳定性要求较高时,Go 是很稳的生产方案。

控制台操作位置

SDK 示例真正依赖的控制台信息主要就两类:一类是密钥,一类是测试桶。先把这两类信息准备齐,再开始复制示例代码。

创建访问密钥
控制台首页 -> 存储管理 -> 访问密钥
  • 为 SDK 调用创建专用密钥。
  • 按应用环境隔离。
  • 只在服务端环境变量里保存。
准备测试桶
控制台首页 -> 存储管理 -> 存储桶
  • 先用 demo 桶验证 SDK。
  • 确认对象路径与前缀规划。
  • 通过最小脚本跑上传与下载。

统一入口

控制台下发接入域名与访问密钥,业务服务按标准 S3 SDK 接入。

统一权限

浏览器和移动端只拿授权结果,不直接保存长期密钥。

统一路径

文件路径按业务、环境、日期规划,便于迁移、审计和归档。

推荐落地步骤

STEP 1
先用本地脚本把 SDK 初始化和最小读写跑通。
STEP 2
再把接入参数收口到服务端配置或密钥系统。
STEP 3
把桶名、对象路径和内容类型做成业务配置项。
STEP 4
最后再接前端上传、任务队列或 AI 作业回写。

通用实践建议

  • 先把初始化代码做成统一模块,不要每个业务接口都重复 new 一次客户端。
  • 把 Bucket、文件前缀、上传超时、Content-Type 校验都做成配置项。
  • 区分“服务端直传”和“浏览器授权直传”两类模式,不要混用。
  • 大文件、视频、模型权重、训练数据集建议优先考虑分段上传。
  • 下载和回写都建议带 requestId,方便排障与审计。

JavaScript / TypeScript

适合 Next.js、Node.js 服务端、后台任务和自动化脚本。

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { readFileSync } from 'node:fs';

const client = new S3Client({
  region: 'auto',
  endpoint: process.env.SURUN_S3_ENDPOINT,
  credentials: {
    accessKeyId: process.env.SURUN_ACCESS_KEY_ID!,
    secretAccessKey: process.env.SURUN_SECRET_ACCESS_KEY!,
  },
});

await client.send(
  new PutObjectCommand({
    Bucket: 'media-assets',
    Key: 'demo/hello.txt',
    Body: readFileSync('./hello.txt'),
    ContentType: 'text/plain',
  }),
);

Python

适合数据处理、AI 训练、模型同步和离线任务。

import os
import boto3

session = boto3.session.Session()
client = session.client(
    's3',
    endpoint_url=os.environ['SURUN_S3_ENDPOINT'],
    aws_access_key_id=os.environ['SURUN_ACCESS_KEY_ID'],
    aws_secret_access_key=os.environ['SURUN_SECRET_ACCESS_KEY'],
    region_name='auto',
)

client.upload_file(
    'weights/model.safetensors',
    'training-assets',
    'models/model.safetensors',
)

Go

适合高并发服务、微服务网关和内部工具。

package main

import (
  "context"
  "os"

  "github.com/minio/minio-go/v7"
  "github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
  client, _ := minio.New(os.Getenv("SURUN_S3_ENDPOINT"), &minio.Options{
    Creds:  credentials.NewStaticV4(os.Getenv("SURUN_ACCESS_KEY_ID"), os.Getenv("SURUN_SECRET_ACCESS_KEY"), ""),
    Secure: true,
  })

  client.FPutObject(context.Background(), "media-assets", "demo/video.mp4", "./video.mp4", minio.PutObjectOptions{})
}

推荐的服务封装方式

不建议把 SDK 代码直接散落在业务接口里。更稳的方式是封成统一的 `storageService`,让上传授权、下载授权和基础对象操作走同一套模块。

import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const client = new S3Client({
  region: 'auto',
  endpoint: process.env.SURUN_S3_ENDPOINT,
  credentials: {
    accessKeyId: process.env.SURUN_ACCESS_KEY_ID!,
    secretAccessKey: process.env.SURUN_SECRET_ACCESS_KEY!,
  },
});

export const storageService = {
  async createUploadUrl(objectKey: string, contentType: string) {
    return getSignedUrl(
      client,
      new PutObjectCommand({
        Bucket: process.env.SURUN_DEFAULT_BUCKET!,
        Key: objectKey,
        ContentType: contentType,
      }),
      { expiresIn: 600 },
    );
  },

  async createDownloadUrl(objectKey: string) {
    return getSignedUrl(
      client,
      new GetObjectCommand({
        Bucket: process.env.SURUN_DEFAULT_BUCKET!,
        Key: objectKey,
      }),
      { expiresIn: 300 },
    );
  },
};

前端直传示例

浏览器上传的正确方式不是把 SDK 和长期密钥塞进前端,而是通过业务后端接口申请授权上传地址。

export async function uploadFromBrowser(file: File) {
  const response = await fetch('/api/storage/presign-upload', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      fileName: file.name,
      contentType: file.type,
    }),
  });

  const { uploadUrl } = await response.json();

  await fetch(uploadUrl, {
    method: 'PUT',
    headers: {
      'Content-Type': file.type,
    },
    body: file,
  });
}

什么时候该用分段上传

  • 单文件较大、网络不稳定或需要断点续传时,优先使用分段上传。
  • 训练数据、视频素材、媒体源文件和大模型权重通常都适合分段上传。
  • 分段上传的初始化、分段并发、失败重试和完成提交建议全部放在服务端协调。
  • 业务已经有任务系统时,推荐把大文件导入交给任务队列处理,而不是让前端页面长时间阻塞。

项目落地建议

  • 测试阶段先用 demo 桶和测试对象路径,不要直接把正式业务文件拿来做试验。
  • 不同应用共用同一套存储服务时,建议每个应用分配固定前缀,例如 app-a/、app-b/。
  • 文件路径建议由业务后端生成,SDK 只负责把文件写到指定位置。
  • 正式项目里,SDK 初始化失败、超时、权限错误都要统一包装成平台级错误。

落地建议

  • 环境变量统一收口到服务端配置,不把长期密钥提交进代码仓库。
  • 先写一个 health-check 脚本,专门验证连接、上传和下载。
  • 把桶名与文件前缀做成配置项,避免代码里写死。
  • 对大文件使用分段上传,对下载链路使用授权地址。
SECURITY NOTICE

前端直传与 SDK 使用边界

  • 浏览器代码只能拿授权结果,不能直接写死长期密钥。
  • Node.js、Python、Go 示例默认都应运行在服务端、任务机或受控容器里。
  • 如果团队多人协作,建议统一 SDK 初始化模块,不要在每个业务文件里重复写连接逻辑。
  • 授权上传时由后端决定最终文件路径,前端只负责上传文件本体。

接入常见问题

可以直接复制这里的代码上线吗?

可以作为起步模板,但建议把桶名、文件前缀、Content-Type 校验和错误处理再按业务封装一层,不要直接散落在各个接口里。

为什么浏览器上传的示例不直接初始化 S3 客户端?

因为浏览器不适合持有长期密钥。正式方案应由前端向业务后端申请授权链接,再由浏览器完成上传。

Go、Python 和 JavaScript 应该怎么选?

按现有业务栈选择即可。关键不在语言,而在是否把密钥、文件路径规划和权限边界统一管理起来。

上一篇
最小后端接入示例
上传下载授权与确认入库的完整串联
下一篇
AI 环境接入说明
常见 AI 环境的接入说明
更多帮助

你可能还需要这些帮助入口

文档中心帮助你完成接入,客户服务页帮助你了解采购、支持与服务信息。

邮件支持

需要迁移协助或接入支持时,可以直接进入邮件支持入口。

进入支持中心

客户常见问题

采购、测试申请、迁移安排与售后问题,可先查看这份常见问题说明。

查看常见问题

价格与采购说明

需要确认容量区间、采购方式、续费与对账说明时,可从这里继续查看。

查看价格说明