Files
car_info/app/service/OssService.php
T

88 lines
2.9 KiB
PHP
Raw Normal View History

2025-04-30 11:30:08 +08:00
<?php
namespace app\service;
use OSS\OssClient;
use OSS\Core\OssException;
class OssService
{
private $accessKeyId;
private $accessKeySecret;
private $bucket;
private $endpoint;
private $ossClient;
public function __construct()
{
2025-04-30 14:45:58 +08:00
try {
2025-05-06 22:06:12 +08:00
$this->accessKeyId = getenv('OSS_ACCESS_KEY_ID');
$this->accessKeySecret = getenv('OSS_ACCESS_KEY_SECRET');
2025-05-19 13:15:36 +08:00
$this->bucket = getenv('OSS_BUCKET', 'vehicle-info');
$this->endpoint = getenv('OSS_ENDPOINT', 'https://oss-ap-southeast-1.aliyuncs.com');
2025-05-06 22:06:12 +08:00
2025-04-30 14:45:58 +08:00
// 记录配置信息
2025-05-06 22:06:12 +08:00
error_log("OSS Configuration:");
error_log("AccessKeyId: " . substr($this->accessKeyId, 0, 4) . "****");
error_log("Bucket: " . $this->bucket);
error_log("Endpoint: " . $this->endpoint);
2025-04-30 14:45:58 +08:00
$this->ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
2025-05-06 22:06:12 +08:00
2025-04-30 14:45:58 +08:00
// 测试连接
$this->ossClient->doesBucketExist($this->bucket);
} catch (OssException $e) {
error_log("OSS Client Initialization Error: " . $e->getMessage());
throw new \RuntimeException('OSS Client Initialization Error: ' . $e->getMessage());
}
2025-04-30 11:30:08 +08:00
}
/**
* 上传图片到 OSS
* @param string $filePath 本地文件路径
* @param string $objectKey OSS上存储的对象名称
* @return string 图片的 URL
*/
public function uploadImage($filePath, $objectKey)
{
try {
// 上传文件到 OSS
$this->ossClient->uploadFile($this->bucket, $objectKey, $filePath);
// 构造图片的私有 URL
$url = $this->generatePrivateUrl($objectKey);
return $url;
} catch (OssException $e) {
// 错误处理
throw new \RuntimeException('OSS Error: ' . $e->getMessage());
}
}
/**
* 生成图片的私有访问 URL
* @param string $objectKey
* @return string
*/
public function generatePrivateUrl($objectKey, $expireTime = 3600)
{
2025-04-30 14:45:58 +08:00
try {
2025-04-30 15:06:32 +08:00
// 生成 OSS 私有 URL
$url = $this->ossClient->signUrl($this->bucket, $objectKey, $expireTime);
2025-05-06 22:06:12 +08:00
2025-04-30 15:40:00 +08:00
// 解析 URL 以获取查询参数
$parsedUrl = parse_url($url);
parse_str($parsedUrl['query'], $queryParams);
2025-05-06 22:06:12 +08:00
2025-04-30 16:03:18 +08:00
// 重新构建 URL,使用 rawurlencode 确保正确的编码
2025-04-30 15:40:00 +08:00
$baseUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . $parsedUrl['path'];
2025-04-30 16:03:18 +08:00
$queryString = http_build_query($queryParams, '', '&', PHP_QUERY_RFC3986);
2025-05-06 22:06:12 +08:00
2025-04-30 15:40:00 +08:00
// 重新组合 URL
$url = $baseUrl . '?' . $queryString;
2025-05-06 22:06:12 +08:00
2025-04-30 14:45:58 +08:00
return $url;
} catch (OssException $e) {
error_log("OSS Error: " . $e->getMessage());
throw new \RuntimeException('OSS Error: ' . $e->getMessage());
}
2025-04-30 11:30:08 +08:00
}
}