您可以通过 TosClient->preSignedURL 生成预签名 URL,并使用生成的预签名 URL 直接发送 HTTP/HTTPS 请求访问 TOS 服务,完成上传对象、下载对象等操作。
使用预签名 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 下载对象必须指定请求方法为 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 下载对象时可以在请求参数中额外添加 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; }