- 产品文档
- > 存储与 CDN
- > 对象存储
- > AWS S3 兼容
- > AWS S3 SDK
- > S3 PHP SDK
- > 文件管理
文件管理
在AWS S3中,用户可以通过一系列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。
列出桶中的文件
您可以使用S3Client::listObjects列出存储中间中的文件:
/**
* @param $s3Client S3Client实例
* @param $bucket 桶名
*/
function listAllObjects($s3Client, $bucket){
for ($i = 0; $i putObject([
'Bucket'=>$bucket,
'Key'=>"dir/obj" . strval($i),
'Body'=> 'hi'
]);
}
$prefix = 'dir/';
$delimiter = '/';
$nextMarker = '';
$maxKeys = 2;
while (true) {
try {
$listObjectInfo = $s3Client->listObjects(['Bucket'=>$bucket,
'Delimiter' => $delimiter,
'Prefix' => $prefix,
'MaxKeys' => $maxKeys,
'Marker' => $nextMarker,]);
} catch (AwsException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
var_dump($listObjectInfo);
//得到nextMarker,从上一次listObjects读到的最后一个文件的下一个文件开始继续获取文件列表
$nextMarker = $listObjectInfo['NextMarker'];
echo "nextMarker" . $nextMarker . "\n";
if ($nextMarker === null) {
break;
}
}
}
上述代码中的$options中的参数如下所示:
参数 | 说明 |
---|---|
delimiter | 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素 |
prefix | 限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix |
max-keys | 限定此次返回object的最大数,如果不设定,默认为100 |
marker | 设定结果从marker之后按字母排序的第一个开始返回 |
Note
上述表中的参数都是可选参数
判断文件是否存在
您可以使用S3Client::doesObjectExist判断文件是否存在:
/**
* @param $S3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function doesObjectExist($s3Client, $bucketName,$objectName)
{
try{
$exist = $s3Client->doesObjectExist($bucketName, $objectName);
} catch(\Aws\Exception\AwsException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
var_dump($exist);
}
删除单个文件
您可以使用S3Client::deleteObject删除单个需要删除的文件:
/**
* @param $nosClient S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function deleteObject($s3Client, $bucketName,$objectName)
{
try{
$s3Client->deleteObject(['Bucket'=>$bucketName, 'Key'=>$objectName]);
} catch(AwsException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
}
删除多个文件
您可以使用S3Client::deleteObjects批量删除文件:
/**
* 批量删除object
*
* @param S3Client $S3Client S3Client实例
* @param string $bucket bucket名字
* @return null
*/
function deleteObjects($S3Client, $bucket)
{
$objects = array();
$objects[] = "nos-php-sdk-test/upload-test-object-name.txt";
$objects[] = "nos-php-sdk-test/upload-test-object-name.txt.copy";
try{
$S3Client->deleteObjects($bucket, $objects);
} catch(AwsException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
}
Attention>
该接口目前不兼容,暂时不可用
拷贝文件
您可以使用S3Client::copyObject拷贝文件:
/**
* @param $s3Client
* @param $srcBucketName
* @param $srcObjectName
* @param $destBucketName
* @param $destObjectName
*/
function copyObject($s3Client,$srcBucketName,$srcObjectName,$destBucketName,$destObjectName){
try{
$s3Client->copyObject(['Bucket'=>$destBucketName,'Key'=>$destObjectName,
'CopySource'=>'/' . $srcBucketName . '/' . $srcObjectName]);
} catch (\Aws\Exception\AwsException $exception){
echo $exception->getMessage() . "\n";
}
}
- 支持跨桶的文件copy
修改文件元信息
暂时不提供此类方法
获取文件的文件元信息
您可以使用S3Client::getObjectMeta获取对象的元数据信息:
/**
* @param $s3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function getObjectMeta($s3Client,$bucketName,$objectName){
try{
$result = $s3Client->headObject(['Bucket'=>$bucketName,'Key'=>$objectName]);
echo $result . "\n";
echo $result['ContentLength'];
} catch (\Aws\Exception\AwsException $exception){
echo $exception->getMessage() . "\n";
}
}
Attention>
1. 获取的元数据通过一个array返回,返回值为HTTP头类型的元数据与用户自定义元数据
2. 元数据名均为小写
生成私有云对象可以下载的URL链接
您可以使用S3Client::getCommand获取对象可下载URL:
/**
* @param $s3Client
* @param $bucketName
* @param $objectName
*/
function generatePresignedUrl($s3Client, $bucketName, $objectName){
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => $bucketName,
'Key' => $objectName
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 hours'); // minutes,hours
// Get the actual presigned-url
$presignedUrl = (string) $request->getUri();
echo $presignedUrl;
}