oss.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace common\components;
  3. use OSS\Core\OssException;
  4. use OSS\OssClient;
  5. use Yii;
  6. class oss
  7. {
  8. // 文件夹常量数组: 1. uploads_pic_text -- 图文专用文件夹 2.
  9. /** 允许自定义的 OSS 根目录白名单 */
  10. const ROOT_PATHS = ['uploads_pic_text', 'uploads_home_banner', 'uploads_home_nav'];
  11. //上传文件
  12. public static function uploadImage($object, $filePath)
  13. {
  14. $ossClient = self::getOssClient();
  15. $bucket = Yii::$app->params['ossBucket'];
  16. if (empty($bucket)) {
  17. util::fail('OSS Bucket 未配置');
  18. }
  19. if (empty($filePath) || !is_file($filePath) || !is_readable($filePath)) {
  20. util::fail('本地上传文件不存在或不可读');
  21. }
  22. try {
  23. $ossClient->uploadFile($bucket, $object, $filePath);
  24. } catch (OssException $e) {
  25. $httpStatus = $e->getHTTPStatus();
  26. $errorCode = $e->getErrorCode();
  27. $requestId = $e->getRequestId();
  28. $body = (string)$e->getDetails();
  29. Yii::error(sprintf(
  30. 'OSS uploadImage failed: object=%s bucket=%s http=%s code=%s requestId=%s msg=%s body=%s',
  31. $object,
  32. $bucket,
  33. $httpStatus,
  34. $errorCode,
  35. $requestId,
  36. $e->getMessage(),
  37. substr($body, 0, 500)
  38. ), __METHOD__);
  39. // SDK 在空响应时 getMessage() 仅为 ": RequestId: ",补充可读信息
  40. $msg = trim($e->getMessage());
  41. if ($msg === '' || $msg === ': RequestId:' || preg_match('/^:\s*RequestId:\s*$/', $msg)) {
  42. $parts = array_filter([
  43. $httpStatus !== '' ? ('HTTP ' . $httpStatus) : '',
  44. $errorCode !== '' ? $errorCode : '',
  45. $requestId !== '' ? ('RequestId: ' . $requestId) : '',
  46. ]);
  47. $msg = $parts ? ('OSS上传失败: ' . implode(', ', $parts)) : 'OSS上传失败,未返回错误详情';
  48. if ($body !== '') {
  49. $msg .= ' (' . substr(strip_tags($body), 0, 120) . ')';
  50. }
  51. }
  52. util::fail($msg);
  53. }
  54. return true;
  55. }
  56. public static function uploadContent($object,$content)
  57. {
  58. $ossClient = self::getOssClient();
  59. $bucket = Yii::$app->params['ossBucket'];
  60. try {
  61. $ossClient->putObject($bucket, $object, $content);
  62. } catch (OssException $e) {
  63. util::fail($e->getMessage());
  64. }
  65. return true;
  66. }
  67. public static function getOssClient()
  68. {
  69. $accessKeyId = Yii::$app->params['accessKeyId'];
  70. $accessKeySecret = Yii::$app->params['accessKeySecret'];
  71. $endpoint = Yii::$app->params['endpoint'];
  72. // 未带协议时强制走 HTTPS,避免 HTTP:80 PUT 被中间网络截断(unexpected EOF)
  73. if (strpos($endpoint, 'http://') !== 0 && strpos($endpoint, 'https://') !== 0) {
  74. $endpoint = 'https://' . ltrim($endpoint, '/');
  75. }
  76. try {
  77. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  78. return $ossClient;
  79. } catch (OssException $e) {
  80. util::fail($e->getMessage());
  81. }
  82. }
  83. //判断文件是否存在 ssh 2021.4.18
  84. public static function getFile($object)
  85. {
  86. $ossClient = self::getOssClient();
  87. $bucket = Yii::$app->params['ossBucket'];
  88. try {
  89. return $ossClient->getObject($bucket, $object);
  90. } catch (OssException $e) {
  91. util::fail($e->getMessage());
  92. }
  93. }
  94. //判断文件是否存在 ssh 2021.4.18
  95. public static function fileExist($object)
  96. {
  97. $ossClient = self::getOssClient();
  98. $bucket = Yii::$app->params['ossBucket'];
  99. $ossClient->doesObjectExist($bucket, $object);
  100. try {
  101. return $ossClient->doesObjectExist($bucket, $object);
  102. } catch (OssException $e) {
  103. util::fail($e->getMessage());
  104. }
  105. }
  106. // oss水印 guoruidian 2021.5.16
  107. // oss::watermark('fdafas.jpg', [
  108. // 'image_xxx,size_20,g_sw,x_100,y_50',
  109. // 'text_xxx,color_0000b7,size_20,g_sw,x_100,y_50',
  110. // ])
  111. public static function watermark($object, array $process)
  112. {
  113. return Yii::$app->params['hdImgHost']. $object . "?x-oss-process=image/watermark,". implode('/watermark,', $process);
  114. }
  115. //上传语音
  116. public static function uploadTmpAudio($object, $filePath,$bucket = '')
  117. {
  118. $ossClient = self::getOssClient();
  119. $bucket = Yii::$app->params['ossBucket'];
  120. try {
  121. $ossClient->putObject($bucket, $object, $filePath);
  122. } catch (OssException $e) {
  123. util::fail($e->getMessage());
  124. }
  125. return true;
  126. }
  127. //删除文件
  128. public static function deleteObject($object)
  129. {
  130. $ossClient = self::getOssClient();
  131. $bucket = Yii::$app->params['ossBucket'];
  132. try {
  133. $ossClient->deleteObject($bucket, $object);
  134. } catch (OssException $e) {
  135. util::fail($e->getMessage());
  136. }
  137. return true;
  138. }
  139. //批量删除文件
  140. public static function deleteObjects($objects)
  141. {
  142. $ossClient = self::getOssClient();
  143. $bucket = Yii::$app->params['ossBucket'];
  144. try {
  145. $ossClient->deleteObjects($bucket, $objects);
  146. } catch (OssException $e) {
  147. util::fail($e->getMessage());
  148. }
  149. return true;
  150. }
  151. }