当前位置:首页 > 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):

php实现oss

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)。

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

标签: phposs
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

git php实现

git php实现

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

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现单一入口

php实现单一入口

PHP 单一入口实现方法 单一入口(Single Entry Point)是一种设计模式,通过一个入口文件(如index.php)集中处理所有请求,实现路由分发、统一初始化等操作。以下是实现方法:…