更新时间:2026-06-30 GMT+08:00

批量上传对象

开发过程中,您有任何问题可以在GitHub上提交issue接口参考文档详细介绍了每个接口的参数和使用方法。

批量上传基于以下三种单次上传方式,您可以根据文件类型和大小选择合适的上传方式,结合下方的示例代码实现批量上传。

示例代码

本示例用于批量上传本地目录中的文件到OBS指定桶。您可以通过递归扫描本地目录, 再以指定并发数并发上传,文件按相对路径生成OBS对象Key,适用于本地文件批量迁移、数据备份上传等场景。

<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/intl/zh-cn/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      // endpoint填写Bucket对应的Endpoint, 此处以中国-香港为例,其他地区请按实际情况填写。
       'endpoint' => "obs.ap-southeast-1.myhuaweicloud.com",
      'signature' => 'obs'
] );

$bucketName = 'bucketname';
$localDir = '/tmp/upload-dir';
$keyPrefix = 'backup/';
$concurrency = 5;

// 递归扫描本地目录
$files = [];
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($localDir));
foreach ($iterator as $file) {
       if ($file->isFile()) {
              $relativePath = substr($file->getPathname(), strlen($localDir) + 1);
              $files[] = ['Key' => $keyPrefix . str_replace('\\', '/', $relativePath), 'SourceFile' => $file->getPathname()];
       }
}
printf("Found %d files to upload\n\n", count($files));

// 并发上传对象,putObject单次上传不支持超过5GB的文件,大文件请使用多段上传
// 生产环境建议增加重试机制,避免网络波动或临时故障导致数据不完整 
$successCount = 0;
$failCount = 0;

$promiseGenerator = function () use ($obsClient, $bucketName, $files, &$successCount, &$failCount) {
       foreach ($files as $object) {
              yield $obsClient->putObjectAsync ( [
                     'Bucket' => $bucketName,
                     'Key' => $object['Key'],
                     'SourceFile' => $object['SourceFile']
              ], function ($exception, $resp) use ($object, &$successCount, &$failCount) {
                     if ($exception === null) {
                            printf ( "Key:%s, ETag:%s, RequestId:%s\n", $object['Key'], $resp['ETag'], $resp['RequestId'] );
                            $successCount++;
                     } else {
                            printf ( "UploadFailed: Key:%s, Status:%d, Message:%s\n", $object['Key'], $exception->getStatusCode(), $exception->getExceptionMessage() );
                            $failCount++;
                     }
              } );
       }
};

$eachPromise = new EachPromise($promiseGenerator(), [
       'concurrency' => $concurrency
]);

$eachPromise->promise()->wait();

printf("\nResult: success=%d, fail=%d\n", $successCount, $failCount);