当前位置:首页 > PHP

php实现oss

2026-01-29 16:44:05PHP

PHP 实现 OSS 上传

使用 PHP 实现阿里云 OSS(对象存储服务)上传功能,可以通过官方 SDK 或直接调用 API 实现。以下是两种常见方法的详细说明:

使用阿里云 OSS SDK

  1. 安装 SDK
    通过 Composer 安装阿里云 OSS SDK:

    composer require aliyuncs/oss-sdk-php
  2. 初始化客户端
    配置 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();
    }
  3. 上传文件
    使用 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

  1. 生成签名
    使用 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));
  2. 上传文件
    通过 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)。

以上方法覆盖了从简单上传到分片上传的场景,可根据实际需求选择。

php实现oss

标签: phposs
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…