文档首页/ 对象存储服务 OBS/ SDK参考/ Android/ 常见问题/ 如何实现上传下载限速
更新时间:2026-09-10 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() 设置自定义头域

代码示例一:上传限速

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

import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.PutObjectRequest;
import com.obs.services.model.PutObjectResult;
import java.util.HashMap;
import java.io.File;

public class PutObjectDemo {
    private static final String TAG = "PutObjectDemo";

    public void execute() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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(TAG, "putObject successfully");
                } catch (ObsException e) {
                    Log.e(TAG, "execute failed");
                    Log.e(TAG, "HTTP Code:" + e.getResponseCode());
                    Log.e(TAG, "Error Code:" + e.getErrorCode());
                    Log.e(TAG, "Error Message:" + e.getErrorMessage());
                    Log.e(TAG, "Request ID:" + e.getErrorRequestId());
                    Log.e(TAG, "Host ID:" + e.getErrorHostId());
                } catch (Exception e) {
                    Log.e(TAG, "execute failed");
                    Log.e(TAG, e.getMessage());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

代码示例二:下载限速

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

import android.util.Log;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.GetObjectRequest;
import com.obs.services.model.ObsObject;
import java.util.HashMap;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class GetObjectDemo {
    private static final String TAG = "GetObjectDemo";

    public void execute() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 认证用的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);
                    // 读取对象内容,使用try-with-resources确保流在任何情况下都能被关闭
                    try (InputStream input = obsObject.getObjectContent();
                         ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
                        byte[] b = new byte[1024];
                        int len;
                        while ((len = input.read(b)) != -1) {
                            bos.write(b, 0, len);
                        }
                        Log.i(TAG, "getObjectContent successfully");
                        Log.i(TAG, new String(bos.toByteArray()));
                    } catch (IOException e) {
                        Log.e(TAG, "read object content failed", e);
                    }
                } catch (ObsException e) {
                    Log.e(TAG, "execute failed");
                    Log.e(TAG, "HTTP Code:" + e.getResponseCode());
                    Log.e(TAG, "Error Code:" + e.getErrorCode());
                    Log.e(TAG, "Error Message:" + e.getErrorMessage());
                    Log.e(TAG, "Request ID:" + e.getErrorRequestId());
                    Log.e(TAG, "Host ID:" + e.getErrorHostId());
                } catch (Exception e) {
                    Log.e(TAG, "execute failed");
                    Log.e(TAG, e.getMessage());
                } finally {
                    try {
                        obsClient.close();
                    } catch (Exception e) {
                        // 忽略关闭异常
                    }
                }
            }
        }).start();
    }
}

相关文档