更新时间: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)。
| 约束项 | 说明 |
|---|---|
| 限速头域 | 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();
}
} 父主题: 常见问题