7. 文件管理¶
在AWS S3中,用户可以通过一系列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。
7.1. 列出桶中的文件¶
您可以使用S3Client::listObjects列出存储中间中的文件:
<?php
/**
* @param $s3Client S3Client实例
* @param $bucket 桶名
*/
function listAllObjects($s3Client, $bucket){
for ($i = 0; $i < 100; $i += 1) {
$s3Client->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;
}
}
}
上述代码中的数据筛选参数如下所示:
参数 | 说明 |
---|---|
Delimiter | 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素 |
Prefix | 限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix |
MaxKeys | 限定此次返回object的最大数,如果不设定,默认为100 |
Marker | 设定结果从marker之后按字母排序的第一个开始返回 |
Note
上述表中的参数都是可选参数
7.2. 判断文件是否存在¶
您可以使用S3Client::doesObjectExist判断文件是否存在:
<?php
/**
* @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);
}
7.3. 删除单个文件¶
您可以使用S3Client::deleteObject删除单个需要删除的文件:
<?php
/**
* @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");
}
7.4. 删除多个文件¶
您可以使用S3Client::deleteObjects批量删除文件:
<?php
/**
* 批量删除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
该接口目前不兼容,暂时不可用
7.5. 拷贝文件¶
您可以使用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";
}
}
Attention
- 支持跨桶的文件copy
7.6. 修改文件元信息¶
暂时不提供此类方法
7.7. 获取文件的文件元信息¶
您可以使用S3Client::getObjectMeta获取对象的元数据信息:
<?php
/**
* @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
- 获取的元数据通过一个array返回,返回值为HTTP头类型的元数据与用户自定义元数据
- 元数据名均为小写
7.8. 生成私有云对象可以下载的URL链接¶
您可以使用S3Client::getCommand获取对象可下载URL:
<?php
/**
* @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;
}