导入 AWS SDK for PHP
确保 PHP v5.5 或更新版本已经安装。
其他推荐配置
- 使用 cURL 7.16.2 或更新版本
- 使用 OPCache
- 不使用 Xdebug
- 使用 Composer 自动加载依赖
- 详见:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/getting-started_requirements.html
添加 AWS SDK for PHP 包
composer require aws/aws-sdk-php=3.281.15
对于之后的每个代码示例,将代码创建在 main.php
后,执行
php main.php
即可执行代码。
对象上传
获取客户端上传 URL
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
$request = $s3Client->createPresignedRequest($s3Client->getCommand("GetObject", ["Bucket" => "<Bucket>", "Key" => "<Key>"]), "+1 hours");
echo $request->getUri() . "\n";
这段代码将生成一个经过预先签名的客户端上传 URL,有效期为 1 小时,客户端可以在过期时间内对该 URL 发送 HTTP PUT 请求将文件上传。
以下是用 curl 上传文件的案例:
curl -X PUT --upload-file "<path/to/file>" "<presigned url>"
服务器端直传
单请求上传(文件)
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$putObjectResponse = $s3Client->putObject(["Bucket" => "<Bucket>", "Key" => "<Key>", "SourceFile" => "<path/to/upload>"]);
echo "ETag: " . $putObjectResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
单请求上传(数据流)
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$putObjectResponse = $s3Client->putObject(["Bucket" => "<Bucket>", "Key" => "<Key>", "Body" => "Hello, Qiniu S3!"]);
echo "ETag: " . $putObjectResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
分片上传(文件)
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
const PART_SIZE = 5 * 1024 * 1024; // 分片大小为 5 MB
try {
$createMultipartUploadResponse = $s3Client->createMultipartUpload(["Bucket" => "<Bucket>", "Key" => "<Key>"]);
$file = fopen("<path/to/upload>", "rb");
if (!$file) {
return;
}
$parts = array();
try {
// 这里给出的案例是串行分片上传。可以自行改造成并行分片上传以进一步提升上传速度
for ($partNumber = 1;; $partNumber++) {
$partBody = fread($file, PART_SIZE);
if (!$partBody) {
break;
}
$uploadPartResponse = $s3Client->uploadPart([
"Bucket" => $createMultipartUploadResponse["Bucket"],
"Key" => $createMultipartUploadResponse["Key"],
"UploadId" => $createMultipartUploadResponse["UploadId"],
"PartNumber" => $partNumber,
"Body" => $partBody,
]);
array_push($parts, ["ETag" => $uploadPartResponse["ETag"], "PartNumber" => $partNumber]);
}
} finally {
if (!$file) {
fclose($file);
}
}
$completeMultipartUploadResponse = $s3Client->completeMultipartUpload([
"Bucket" => $createMultipartUploadResponse["Bucket"],
"Key" => $createMultipartUploadResponse["Key"],
"UploadId" => $createMultipartUploadResponse["UploadId"],
"MultipartUpload" => [
"Parts" => $parts,
]
]);
echo 'ETag: ' . $completeMultipartUploadResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
上传文件
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
$file = fopen("<path/to/upload>", "r") or die("Unable to open file");
try {
$resp = $s3Client->upload("<Bucket>", "<Key>", $file);
echo 'ETag: ' . $resp["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
} finally {
fclose($file);
}
上传目录
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->uploadDirectory("<path/to/upload>", "<Bucket>", "<KeyPrefix>");
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
对象下载
获取客户端下载 URL
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
$request = $s3Client->createPresignedRequest($s3Client->getCommand("PutObject", ["Bucket" => "<Bucket>", "Key" => "<Key>"]), "+1 hours");
echo $request->getUri() . "\n";
这段代码将生成一个经过预先签名的客户端下载 URL,有效期为 1 小时,客户端可以在过期时间内对该 URL 发送 HTTP GET 请求将文件下载。
以下是用 curl 下载文件的案例:
curl -o "<path/to/download>" "<presigned url>"
服务器端直接下载
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$getObjectResponse = $s3Client->getObject(["Bucket" => "<Bucket>", "Key" => "<Key>", "SaveAs" => "<path/to/download>"]);
echo "ETag: " . $getObjectResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
下载目录
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->downloadBucket("<path/to/download>", "<Bucket>", "<KeyPrefix>");
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
对象管理
获取对象信息
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$headObjectResponse = $s3Client->headObject(["Bucket" => "<Bucket>", "Key" => "<Key>"]);
echo "ETag: " . $headObjectResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
修改对象 MimeType
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->copyObject([
"Bucket" => "<Bucket>",
"Key" => "<Key>",
"MetadataDirective" => "REPLACE",
"CopySource" => "/<Bucket>/<Key>",
"ContentType" => "<NewContentType>",
]);
echo "Done\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
修改对象存储类型
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->copyObject([
"Bucket" => "<Bucket>",
"Key" => "<Key>",
"MetadataDirective" => "REPLACE",
"CopySource" => "/<Bucket>/<Key>",
"StorageClass" => "GLACIER",
]);
echo "Done\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
复制对象副本
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->copyObject([
"Bucket" => "<ToBucket>",
"Key" => "<ToKey>",
"MetadataDirective" => "COPY",
"CopySource" => "/<FromBucket>/<FromKey>",
]);
echo "Done\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
复制对象副本(大于 5GB)
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
const PART_SIZE = 5 * 1024 * 1024; // 分片大小为 5 MB
try {
$headObjectRequest = ["Bucket" => "<FromBucket>", "Key" => "<FromKey>"];
$headObjectResponse = $s3Client->headObject($headObjectRequest);
$createMultipartUploadResponse = $s3Client->createMultipartUpload(["Bucket" => "<ToBucket>", "Key" => "<ToKey>"]);
$parts = array();
$copied = 0;
// 这里给出的案例是串行分片复制。可以自行改造成并行分片复制以进一步提升复制速度
for ($partNumber = 1; $headObjectResponse["ContentLength"] > $copied; $partNumber++) {
$partSize = min(PART_SIZE, $headObjectResponse["ContentLength"] - $copied);
$uploadPartCopyResponse = $s3Client->uploadPartCopy([
"Bucket" => $createMultipartUploadResponse["Bucket"],
"Key" => $createMultipartUploadResponse["Key"],
"UploadId" => $createMultipartUploadResponse["UploadId"],
"PartNumber" => $partNumber,
"CopySource" => "/" . $headObjectRequest["Bucket"] . "/" . $headObjectRequest["Key"],
"CopySourceRange" => "bytes=" . $copied . "-" . ($copied + $partSize),
]);
array_push($parts, ["ETag" => $uploadPartCopyResponse["CopyPartResult"]["ETag"], "PartNumber" => $partNumber]);
$copied += $partSize;
}
$completeMultipartUploadResponse = $s3Client->completeMultipartUpload([
"Bucket" => $createMultipartUploadResponse["Bucket"],
"Key" => $createMultipartUploadResponse["Key"],
"UploadId" => $createMultipartUploadResponse["UploadId"],
"MultipartUpload" => [
"Parts" => $parts,
]
]);
echo 'ETag: ' . $completeMultipartUploadResponse["ETag"] . "\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
删除空间中的文件
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->deleteObject(["Bucket" => "<Bucket>", "Key" => "<Key>"]);
echo "Done\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
获取指定前缀的文件列表
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$listObjectsV2Response = $s3Client->listObjectsV2(["Bucket" => "<Bucket>", "Prefix" => "<KeyPrefix>"]);
foreach ($listObjectsV2Response["Contents"] as $content) {
echo "Key: " . $content["Key"] . "\n";
echo "ETag: " . $content["ETag"] . "\n";
}
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
批量删除空间中的文件
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$s3Client->deleteObjects([
"Bucket" => "<Bucket>",
"Delete" => [
"Objects" => [
["Key" => "<Key1>"],
["Key" => "<Key2>"],
["Key" => "<Key3>"],
]
],
]);
echo "Done\n";
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
临时安全凭证
创建 main.php
<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\Sts\StsClient;
use Aws\Credentials\Credentials;
use Aws\Exception\AwsException;
$stsClient = new StsClient([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials("<QiniuAccessKey>", "<QiniuSecretKey>"),
]);
try {
$getFederationTokenResponse = $stsClient->getFederationToken([
"Name" => "Bob",
"Policy" => json_encode([
"Version" => "2012-10-17",
"Statement" => [
[
"Sid" => "Stmt1",
"Effect" => "Allow",
"Action" => ["*"],
"Resource" => ["*"],
],
],
]),
"DurationSeconds" => 3600,
]);
$credentials = $getFederationTokenResponse["Credentials"];
$s3Client = new S3Client([
"region" => "cn-east-1", // 华东-浙江区 region id
"endpoint" => "https://s3.cn-east-1.qiniucs.com", // 华东-浙江区 endpoint
"credentials" => new Credentials($credentials["AccessKeyId"], $credentials["SecretAccessKey"], $credentials["SessionToken"], $credentials["Expiration"]),
]);
// 可以使用这些临时凭证调用 S3 服务
$listBucketsResponse = $s3Client->listBuckets();
foreach ($listBucketsResponse["Buckets"] as $bucket) {
echo $bucket["Name"] . "\n";
}
} catch (AwsException $e) {
echo "Error: " . $e . "\n";
}
文档反馈
(如有产品使用问题,请 提交工单)