文档首页/ 对象存储服务 OBS/ SDK参考/ Android/ 常见问题/ 如何实现上传下载限速
更新时间:2026-08-14 GMT+08:00

如何实现上传下载限速

OBS 支持在上传或下载对象时对单条链接进行限速,通过在请求中设置自定义头域 x-obs-traffic-limit,SDK 透传该头域至服务端,服务端校验后完成限速控制。

  • 限速单位:bit/s。例如 819200 表示限速 100KB/s(819200 bit/s ÷ 8 = 102400 B/s = 100 KB/s)。
  • 适用场景:当需要在带宽有限的环境中控制 OBS 请求的传输速率,避免占用过多网络资源时,可使用单链接限速功能。
  • 适用接口:上传对象(PutObject)和下载对象(GetObject)。
表1 约束

约束项

说明

限速头域

x-obs-traffic-limit

限速值范围

819200 ~ 838860800(即 100KB/s ~ 100MB/s)

限速单位

bit/s

设置方式

通过 PutObjectRequest.setUserHeaders() 或 GetObjectRequest.setUserHeaders() 设置自定义头域

代码示例一:上传限速

以下代码展示了在上传对象时设置单链接限速。

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
// 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。
String endPoint = "https://your-endpoint";

// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);

try {
    // 文件上传
    // localfile 为待上传的本地文件路径,需要指定到具体的文件名
    PutObjectRequest request = new PutObjectRequest();
    request.setBucketName("examplebucket");
    request.setObjectKey("objectname");
    request.setFile(new File("localfile"));

    HashMap<String, String> userHeaders = new HashMap<>();
    // x-obs-traffic-limit为自定义限速功能,单位为bit/s,此处以819200为例,表示此请求限速100KB/s
    userHeaders.put("x-obs-traffic-limit", "819200");
    request.setUserHeaders(userHeaders);

    PutObjectResult result = obsClient.putObject(request);
    Log.i("PutObject", "putObject successfully");
} catch (ObsException e) {
    Log.e("PutObject", "Response Code: " + e.getResponseCode());
    Log.e("PutObject", "Error Message: " + e.getErrorMessage());
    Log.e("PutObject", "Error Code:       " + e.getErrorCode());
    Log.e("PutObject", "Request ID:      " + e.getErrorRequestId());
    Log.e("PutObject", "Host ID:           " + e.getErrorHostId());
} catch (Exception e) {
    Log.e("PutObject", "putObject failed: " + e.getMessage());
}

代码示例二:下载限速

以下代码展示了在下载对象时设置单链接限速。

// 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
// 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。
// 您可以登录访问管理控制台获取访问密钥AK/SK
String ak = System.getenv("ACCESS_KEY_ID");
String sk = System.getenv("SECRET_ACCESS_KEY_ID");
// endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。
String endPoint = "https://your-endpoint";

// 创建ObsClient实例
ObsClient obsClient = new ObsClient(ak, sk, endPoint);

try {
    // 下载对象
    GetObjectRequest request = new GetObjectRequest("examplebucket", "objectname");

    HashMap<String, String> userHeaders = new HashMap<>();
    // x-obs-traffic-limit为自定义限速功能,单位为bit/s,此处以819200为例,表示此请求限速100KB/s
    userHeaders.put("x-obs-traffic-limit", "819200");
    request.setUserHeaders(userHeaders);

    ObsObject obsObject = obsClient.getObject(request);
    // 读取对象内容
    InputStream input = obsObject.getObjectContent();
    byte[] b = new byte[1024];
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    int len;
    while ((len = input.read(b)) != -1) {
        bos.write(b, 0, len);
    }
    Log.i("GetObject", "getObjectContent successfully");
    Log.i("GetObject", new String(bos.toByteArray()));
    bos.close();
    input.close();
} catch (ObsException e) {
    Log.e("GetObject", "Response Code: " + e.getResponseCode());
    Log.e("GetObject", "Error Message: " + e.getErrorMessage());
    Log.e("GetObject", "Error Code:       " + e.getErrorCode());
    Log.e("GetObject", "Request ID:      " + e.getErrorRequestId());
    Log.e("GetObject", "Host ID:           " + e.getErrorHostId());
} catch (Exception e) {
    Log.e("GetObject", "getObjectContent failed: " + e.getMessage());
}