You need to enable JavaScript to run this app.
导航

预签名的 URL(PHP SDK)

最近更新时间2024.02.04 18:30:58

首次发布时间2022.11.16 14:58:44

您可以通过 TosClient->preSignedURL 生成预签名 URL,并使用生成的预签名 URL 直接发送 HTTP/HTTPS 请求访问 TOS 服务,完成上传对象、下载对象等操作。

使用预签名 URL 上传对象

使用预签名 URL 上传对象必须指定请求方法为 Enum::HttpMethodPut,示例代码如下:

<?php

// 假设使用 composer 安装
require_once __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use Tos\TosClient;
use Tos\Model\PreSignedURLInput;
use Tos\Model\Enum;

try {
    $client = new TosClient([
        'region' => 'your region',
        'endpoint' => 'your endpoint',
        // 从环境变量中获取访问密钥
        'ak' => getenv('TOS_ACCESS_KEY'),
        'sk' => getenv('TOS_SECRET_KEY'),
    ]);
    
    
    // 生成上传对象的预签名 URL
    $input = new PreSignedURLInput(Enum::HttpMethodPut,  'bucket-test',  'key-test');
    // 设置秒为单位的有效期,最大 7 天
    $input->setExpires(3600);
    $output = $client->preSignedURL($input);
    // 获取预签名的 URL 和头域
    echo $output->getSignedUrl() . PHP_EOL;
    echo var_export($output->getSignedHeader()) . PHP_EOL;
    
    $httpClient = new Client(
        [
            'timeout' => 10,
            'allow_redirects' => false,
            'http_errors' => false,
        ]
    );
    
    // 使用预签名 URL 发送 HTTP 请求上传对象
    $output = $httpClient->put($output->getSignedUrl(), ['headers' => $output->getSignedHeader(), 'body' => 'hello world']);
    echo $output->getStatusCode() . PHP_EOL;
    $output->getBody()->close();

} catch (\RuntimeException $ex) {
    echo $ex->getMessage() . PHP_EOL;
}

使用预签名 URL 下载对象

使用预签名 URL 下载对象必须指定请求方法为 Enum::HttpMethodGet,示例代码如下:

<?php

// 假设使用 composer 安装
require_once __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use Tos\TosClient;
use Tos\Model\PreSignedURLInput;
use Tos\Model\Enum;

try {
    $client = new TosClient([
        'region' => 'your region',
        'endpoint' => 'your endpoint',
        // 从环境变量中获取访问密钥
        'ak' => getenv('TOS_ACCESS_KEY'),
        'sk' => getenv('TOS_SECRET_KEY'),
    ]);
    
    
    // 生成下载对象的预签名 URL
    $input = new PreSignedURLInput(Enum::HttpMethodGet,  'bucket-test',  'key-test');
    // 设置秒为单位的有效期,最大 7 天
    $input->setExpires(3600);
    $output = $client->preSignedURL($input);
    // 获取预签名的 URL 和头域
    echo $output->getSignedUrl() . PHP_EOL;
    echo var_export($output->getSignedHeader()) . PHP_EOL;
    
    $httpClient = new Client(
        [
            'timeout' => 10,
            'allow_redirects' => false,
            'http_errors' => false,
        ]
    );
    
    // 使用预签名 URL 发送 HTTP 请求下载对象
    $output = $httpClient->get($output->getSignedUrl(), ['headers' => $output->getSignedHeader(), 'stream' => true]);
    echo $output->getStatusCode() . PHP_EOL;
    // 读取数据到内存
    echo $output->getBody()->getContents() . PHP_EOL;
    $output->getBody()->close();

} catch (\RuntimeException $ex) {
    echo $ex->getMessage() . PHP_EOL;
}

生成图片转码/视频截帧的预签名 URL

使用预签名 URL 下载对象时可以在请求参数中额外添加 x-tos-process,表示执行图片转码或视频截帧操作,示例代码如下:

<?php

// 假设使用源码安装且需要集成 SDK 的脚本与 TOS PHP SDK 的源码在同一个父目录下
require_once __DIR__  .  '/autoload.php';

use GuzzleHttp\Client;
use Tos\TosClient;
use Tos\Model\PreSignedURLInput;
use Tos\Model\Enum;

try {
    $client = new TosClient([
        'region' => 'your region',
        'endpoint' => 'your endpoint',
        // 从环境变量中获取访问密钥
        'ak' => getenv('TOS_ACCESS_KEY'),
        'sk' => getenv('TOS_SECRET_KEY'),
    ]);
    
    
    // 生成下载对象的预签名 URL
    $input = new PreSignedURLInput(Enum::HttpMethodGet,  'bucket-test',  'key-test');
    // 设置秒为单位的有效期,最大 7 天
    $input->setExpires(3600);
    // 设置图片转码参数
    $input->setQuery([
        'x-tos-process' => 'image/info'
    ]);
    // 设置视频截帧参数
    // $input->setQuery([
        //'x-tos-process' => 'video/snapshot,t_26000,w_400,h_200,f_jpg'
    //]);
    $output = $client->preSignedURL($input);
    // 获取预签名的 URL 和头域
    echo $output->getSignedUrl() . PHP_EOL; 

} catch (\RuntimeException $ex) {
    echo $ex->getMessage() . PHP_EOL;
}