客户端访问OSS内的文件时会占用较大带宽,在一些不容易做流控的客户端上可能会对其他应用造成影响。为避免这种问题,您可以通过OSS提供的单链接限速功能在上传、下载、拷贝文件时进行流量控制,以保证其他应用的网络带宽。

使用场景

  • 移动端、Web端等不易实现客户端限速的场景,可以通过单链接限速限制访问OSS的带宽,以保证其他应用的正常使用。
  • 当您需要分享OSS内的文件给他人访问时,可以通过单链接限速限制此次访问的带宽,以保证您其他业务或其他用户的正常访问。

操作方式

您可以在PutObjectAppendObjectPostObjectCopyObjectUploadPartUploadPartCopyGetObject请求中增加x-oss-traffic-limit参数,并指定限速值,OSS将按照指定的限速值对此次请求进行限速。限速值范围为819200 bit/s~838860800 bit/s。具体操作方式如下:

  • 分享文件时进行限速

    您可以在分享给他人的文件URL中加入限速参数,当访问者使用该URL访问目标文件时会被限速。

    • 分享公共读或公共读写文件
      对于公共读或公共读写文件,您需要在分享的文件URL后面加入限速参数x-oss-traffic-limit=<value>。例如https://examplebucket.oss-cn-hangzhou.aliyuncs.com/video.mp4?x-oss-traffic-limit=819200表示下载video.mp4文件时限速为100 KB/s。限速效果如下图所示:video
    • 分享私有文件
      对于私有文件,您需要在生成签名URL时,将限速参数加入签名中一起计算。以Java SDK生成带限速参数的文件签名URL为例,代码如下:
      // 目标Bucket所在地域的Endpoint,以华东1(杭州)地域为例。
      String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
      // 拥有目标Bucket访问权限的AccessKey。阿里云账号的AccessKey拥有所有资源的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维。
      String accessKeyId = "yourAccessKeyId";
      String accessKeySecret = "yourAccessKeySecret";
      // 目标Bucket名称。
      String bucketName = "yourBucketName"
      // 目标文件名称。需填写包含文件路径在内的完整文件名,例如examplefolder/example.txt。
      String objectName = "yourObjectName"
      
      // 限速819200 bit/s,即100 KB/s。
      int limitSpeed = 100 * 1024 * 8;
      
      // 创建OSSClient实例。
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      
      // 生成有效期为60秒的签名URL。
      Date date = new Date();
      date.setTime(date.getTime() + 60 * 1000);
      GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
      request.setExpiration(date);
      request.setTrafficLimit(limitSpeed);
      URL signedUrl = ossClient.generatePresignedUrl(request);
      
      ossClient.shutdown();
  • 客户端发起请求时限速
    以Java SDK进行简单上传时限速为例,代码如下:
    // 目标Bucket所在地域的Endpoint,以华东1(杭州)地域为例。
    String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 拥有目标Bucket访问权限的AccessKey。阿里云账号的AccessKey拥有所有资源的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维。
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";
    // 目标Bucket名称。
    String bucketName = "yourBucketName"
    // 上传后的文件名称。需填写包含文件路径在内的完整文件名,例如examplefolder/example.txt。
    String objectName = "yourObjectName"
    // 本地文件路径。需填写包含文件路径在内的完整文件名。
    String localFileName = "yourLocalFileName"
    
    // 限速819200 bit/s,即100 KB/s。
    int limitSpeed = 100 * 1024 * 8;
    
    // 创建OSSClient实例。
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    // 上传文件。
    InputStream inputStream = new FileInputStream(localFileName);
    PutObjectRequest PutObjectRequest = new PutObjectRequest(bucketName, key, inputStream);
    PutObjectRequest.setTrafficLimit(limitSpeed);
    ossClient.putObject(PutObjectRequest);
    
    ossClient.shutdown();