php实现oss
PHP 实现 OSS 上传
使用 PHP 实现阿里云 OSS(对象存储服务)上传功能,可以通过官方 SDK 或直接调用 API 实现。以下是两种常见方法的详细说明:
使用阿里云 OSS SDK
-
安装 SDK
通过 Composer 安装阿里云 OSS SDK:composer require aliyuncs/oss-sdk-php -
初始化客户端
配置 AccessKey、Endpoint 和 Bucket 名称:require_once __DIR__ . '/vendor/autoload.php'; use OSS\OssClient; use OSS\Core\OssException; $accessKeyId = 'your-access-key-id'; $accessKeySecret = 'your-access-key-secret'; $endpoint = 'oss-cn-hangzhou.aliyuncs.com'; // 替换为你的区域Endpoint $bucket = 'your-bucket-name'; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); } catch (OssException $e) { print $e->getMessage(); } -
上传文件
使用uploadFile方法上传本地文件到 OSS:$object = 'path/in/oss/filename.jpg'; // OSS 中的路径 $filePath = '/local/path/to/file.jpg'; // 本地文件路径 try { $ossClient->uploadFile($bucket, $object, $filePath); echo "File uploaded successfully."; } catch (OssException $e) { echo "Error: " . $e->getMessage(); }
直接调用 OSS API
-
生成签名
使用 AccessKey 生成签名头部,用于鉴权:$accessKeyId = 'your-access-key-id'; $accessKeySecret = 'your-access-key-secret'; $bucket = 'your-bucket-name'; $object = 'path/in/oss/filename.jpg'; $expires = time() + 3600; // 签名有效期(秒) $method = 'PUT'; // 上传使用 PUT 方法 $stringToSign = "$method\n\n\n$expires\n/$bucket/$object"; $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret, true)); -
上传文件
通过 cURL 发送 PUT 请求上传文件:$filePath = '/local/path/to/file.jpg'; $url = "https://$bucket.oss-cn-hangzhou.aliyuncs.com/$object"; $headers = [ "Authorization: OSS $accessKeyId:$signature", "Date: " . gmdate('D, d M Y H:i:s \G\M\T', $expires) ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_PUT, true); curl_setopt($ch, CURLOPT_INFILE, fopen($filePath, 'rb')); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filePath)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); if ($response === false) { echo "Upload failed."; } else { echo "Upload succeeded."; }
分片上传大文件
对于大文件,可以使用分片上传(Multipart Upload):
try {
$uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
$partSize = 10 * 1024 * 1024; // 分片大小(10MB)
$partList = [];
$fileSize = filesize($filePath);
$partCount = ceil($fileSize / $partSize);
for ($i = 1; $i <= $partCount; $i++) {
$offset = ($i - 1) * $partSize;
$length = min($partSize, $fileSize - $offset);
$partList[] = $ossClient->uploadPart(
$bucket,
$object,
$uploadId,
$i,
file_get_contents($filePath, false, null, $offset, $length)
);
}
$ossClient->completeMultipartUpload($bucket, $object, $uploadId, $partList);
echo "Multipart upload completed.";
} catch (OssException $e) {
echo "Error: " . $e->getMessage();
}
注意事项
- 权限设置:确保 Bucket 的 ACL 或 Policy 允许上传操作。
- 错误处理:捕获
OssException异常以处理网络或权限问题。 - Endpoint:根据 OSS 区域选择正确的 Endpoint(如
oss-cn-hangzhou.aliyuncs.com)。
以上方法覆盖了从简单上传到分片上传的场景,可根据实际需求选择。







