版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
详细解答可以参考官方帮助文档
您可以通过一系列的接口管理存储空间(Bucket)下的文件(Object)。管理文件的完整代码请参见:GitHub。
以下代码用于判断指定的文件是否存在:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$exist = $ossClient->doesObjectExist($bucket, $object);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");var_dump($exist);
文件的访问权限(ACL)有以下四种:
| 访问权限 | 描述 | 访问权限值 |
|---|---|---|
| 继承Bucket | 文件遵循存储空间的访问权限。 | default |
| 私有 | 文件的拥有者和授权用户有该文件的读写权限,其他用户没有权限操作该文件。 | private |
| 公共读 | 文件的拥有者和授权用户有该文件的读写权限,其他用户只有文件的读权限。请谨慎使用该权限。 | public-read |
| 公共读写 | 所有用户都有该文件的读写权限。请谨慎使用该权限。 | public-read-write |
文件的访问权限优先级高于存储空间的访问权限。例如存储空间的访问权限是私有,而文件的访问权限是公共读写,则所有用户都有该文件的读写权限。如果某个文件没有设置过访问权限,则遵循存储空间的访问权限。
以下代码用于设置指定文件的访问权限:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";// 设置文件的访问权限为公共读,默认为继承Bucket。$acl = "public-read";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->putObjectAcl($bucket, $object, $acl);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
以下代码用于获取指定文件的访问权限:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$objectAcl = $ossClient->getObjectAcl($bucket, $object);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");var_dump($objectAcl);
文件元信息(Object Meta)详情请参见开发指南中的文件元信息。
以下代码用于设置文件元信息:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";$content = file_get_contents(__FILE__);$options = array(OssClient::OSS_HEADERS => array('Expires' => '2012-10-01 08:00:00','Content-Disposition' => 'attachment; filename="xxxxxx"','x-oss-meta-self-define-title' => 'user define meta info',));try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->putObject($bucket, $object, $content, $options);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
以下代码用于修改文件元信息:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;/// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$fromBucket = "<yourFromBucketName>";$fromObject = "<yourFromObjectName>";$toBucket = "<yourToBucketName>";$toObject = "<yourToObjectName>";$copyOptions = array(OssClient::OSS_HEADERS => array('Expires' => '2018-10-01 08:00:00','Content-Disposition' => 'attachment; filename="xxxxxx"','x-oss-meta-location' => 'location',),);try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $copyOptions);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
以下代码用于获取文件元信息:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$objectMeta = $ossClient->getObjectMeta($bucket, $object);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");if (isset($objectMeta[strtolower('Content-Disposition')]) &&'attachment; filename="xxxxxx"' === $objectMeta[strtolower('Content-Disposition')]) {print(__FUNCTION__ . ": ObjectMeta checked OK" . "\n");} else {print(__FUNCTION__ . ": ObjectMeta checked FAILED" . "\n");}
以下代码用于列举指定存储空间下的所有文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);while (true) {try {$listObjectInfo = $ossClient->listObjects($bucket, $options);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}// 得到nextMarker,从上一次listObjects读到的最后一个文件的下一个文件开始继续获取文件列表。$nextMarker = $listObjectInfo->getNextMarker();$listObject = $listObjectInfo->getObjectList();$listPrefix = $listObjectInfo->getPrefixList();if (!empty($listObject)) {print("objectList:\n");foreach ($listObject as $objectInfo) {print($objectInfo->getKey() . "\n");}}if (!empty($listPrefix)) {print("prefixList: \n");foreach ($listPrefix as $prefixInfo) {print($prefixInfo->getPrefix() . "\n");}}if ($nextMarker === '') {break;}}
以下代码用于列举指定条件的文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$prefix = 'dir/';$delimiter = '/';$nextMarker = '';$maxkeys = 10;$options = array('delimiter' => $delimiter,'prefix' => $prefix,'max-keys' => $maxkeys,'marker' => $nextMarker,);try {$listObjectInfo = $ossClient->listObjects($bucket, $options);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");$objectList = $listObjectInfo->getObjectList(); // object list$prefixList = $listObjectInfo->getPrefixList(); // directory listif (!empty($objectList)) {print("objectList:\n");foreach ($objectList as $objectInfo) {print($objectInfo->getKey() . "\n");}}if (!empty($prefixList)) {print("prefixList: \n");foreach ($prefixList as $prefixInfo) {print($prefixInfo->getPrefix() . "\n");}}
上述例子中的$options包含的参数如下:
| 参数 | 说明 | 是否必需 |
|---|---|---|
| delimiter | 对文件名称进行分组的一个字符。CommonPrefixes是以delimiter结尾,并有共同前缀的文件集合。 | 否 |
| prefix | 本次查询结果的前缀。 | 否 |
| max-keys | 列举文件的最大个数。默认为100,最大值为1000。 | 否 |
| marker | 标明本次列举文件的起点。 | 否 |
以下代码用于删除单个文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->deleteObject($bucket, $object);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
以下代码用于批量删除文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$objects = array();$objects[] = "<yourObjectName1>";$objects[] = "<yourObjectName2>";try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->deleteObjects($bucket, $objects);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
以下代码用于拷贝小于1GB的文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$from_bucket = "<yourFromBucketName>";$from_object = "<yourFromObjectName>";$to_bucket = $bucket;$to_object = $from_object . '.copy';try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->copyObject($from_bucket, $from_object, $to_bucket, $to_object);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");`
对于大于1GB的文件,需要使用分片拷贝。分片拷贝分为三步:
以下代码用于分片拷贝:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$src_bucket = "<yourSourceBucketName>";$src_object = "<yourSourceObjectName>";$dst_bucket = "<yourDestinationBucketName>";$dst_object = "<yourDestinationObjectName>";try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);// 初始化分片。$upload_id = $ossClient->initiateMultipartUpload($dst_bucket, $dst_object);$copyId = 1;// 逐个分片拷贝。$eTag = $ossClient->uploadPartCopy( $src_bucket, $src_object, $dst_bucket, $dst_object,$copyId, $upload_id);$upload_parts[] = array('PartNumber' => $copyId,'ETag' => $eTag,);// 完成分片拷贝。$result = $ossClient->completeMultipartUpload($dst_bucket, $dst_object, $upload_id, $upload_parts);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
归档类型(Archive)的文件需要解冻(Restore)之后才能读取。非归档类型的文件,不要调用restoreObject方法。
归档文件的状态变换过程如下:
以下代码用于解冻归档文件:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->restoreObject($bucket, $object);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
存储类型详情请参见存储类型。
符号链接是一种特殊的文件,它指向某个具体的文件,类似于Windows上使用的快捷方式。符号链接支持自定义元信息。
以下代码用于创建符号链接:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";$symlink = "<yourSymlink>";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->putSymlink($bucket, $symlink, $object);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
获取符号链接要求您对该符号链接有读权限。以下代码用于获取符号链接指向的文件内容:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$symlink = "<yourSymlink>";try {$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$Symlinks = $ossClient->getSymlink($bucket, $symlink);} catch (OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");var_dump($Symlinks);
MD5校验用于确保数据传输的完整性。使用MD5校验时,性能会有所损失。上传文件时默认关闭MD5校验。
以下代码用于上传文件时开启MD5校验:
<?phpif (is_file(__DIR__ . '/../autoload.php')) {require_once __DIR__ . '/../autoload.php';}if (is_file(__DIR__ . '/../vendor/autoload.php')) {require_once __DIR__ . '/../vendor/autoload.php';}use OSS\OssClient;use OSS\Core\OssException;// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。$accessKeyId = "<yourAccessKeyId>";$accessKeySecret = "<yourAccessKeySecret>";// Endpoint以杭州为例,其它Region请按实际情况填写。$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";$bucket= "<yourBucketName>";$object = "<yourObjectName>";$options = array(OssClient::OSS_CHECK_MD5 => true);try{$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);$ossClient->uploadFile($bucket, $object, __FILE__, $options);} catch(OssException $e) {printf(__FUNCTION__ . ": FAILED\n");printf($e->getMessage() . "\n");return;}print(__FUNCTION__ . ": OK" . "\n");
putObject、uploadFile、appendObject、appendFile、multiuploadFile方法支持开启MD5校验。