laravel oss文件上传到阿里云

逃离我推掉我的手 2021-12-03 03:37 570阅读 0赞

需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

使用composer在项目根目录执行以下命令 composer require johnlui/aliyun-oss:~2.0

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM4MTc2_size_16_color_FFFFFF_t_70

构建 Service 文件 需要自己手动建立 app/services/OSS.php

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjM4MTc2_size_16_color_FFFFFF_t_70 1

只需要修改下面的信息,变成自己的阿里云AccessKeyId AccessKeySecret就可以,注意OSS.php 文件中 private $city = ‘青岛’; 所对应的城市,要根据自己OSS相对应的地区所选择,如何查看自己的OSS地区,请到阿里云OSS中查看,修改错误会导致无法连接到阿里云OSS服务器

  1. <?php
  2. namespace App\Services;
  3. use JohnLui\AliyunOSS;
  4. use Exception;
  5. use DateTime;
  6. class OSS {
  7. /* 城市名称:
  8. *
  9. * 经典网络下可选:杭州、上海、青岛、北京、张家口、深圳、香港、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
  10. * VPC 网络下可选:杭州、上海、青岛、北京、张家口、深圳、硅谷、弗吉尼亚、新加坡、悉尼、日本、法兰克福、迪拜
  11. */
  12. private $city = '青岛';
  13. // 经典网络 or VPC
  14. private $networkType = '经典网络';
  15. private $AccessKeyId = '';
  16. private $AccessKeySecret = '';
  17. private $ossClient;
  18. /**
  19. * 私有初始化 API,非 API,不用关注
  20. * @param boolean 是否使用内网
  21. */
  22. public function __construct($isInternal = false)
  23. {
  24. if ($this->networkType == 'VPC' && !$isInternal) {
  25. throw new Exception("VPC 网络下不提供外网上传、下载等功能");
  26. }
  27. $this->ossClient = AliyunOSS::boot(
  28. $this->city,
  29. $this->networkType,
  30. $isInternal,
  31. $this->AccessKeyId,
  32. $this->AccessKeySecret
  33. );
  34. }
  35. /**
  36. * 使用外网上传文件
  37. * @param string bucket名称
  38. * @param string 上传之后的 OSS object 名称
  39. * @param string 上传文件路径
  40. * @return boolean 上传是否成功
  41. */
  42. public static function publicUpload($bucketName, $ossKey, $filePath, $options = [])
  43. {
  44. $oss = new OSS();
  45. $oss->ossClient->setBucket($bucketName);
  46. return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
  47. }
  48. /**
  49. * 使用阿里云内网上传文件
  50. * @param string bucket名称
  51. * @param string 上传之后的 OSS object 名称
  52. * @param string 上传文件路径
  53. * @return boolean 上传是否成功
  54. */
  55. public static function privateUpload($bucketName, $ossKey, $filePath, $options = [])
  56. {
  57. $oss = new OSS(true);
  58. $oss->ossClient->setBucket($bucketName);
  59. return $oss->ossClient->uploadFile($ossKey, $filePath, $options);
  60. }
  61. /**
  62. * 使用外网直接上传变量内容
  63. * @param string bucket名称
  64. * @param string 上传之后的 OSS object 名称
  65. * @param string 上传的变量
  66. * @return boolean 上传是否成功
  67. */
  68. public static function publicUploadContent($bucketName, $ossKey, $content, $options = [])
  69. {
  70. $oss = new OSS();
  71. $oss->ossClient->setBucket($bucketName);
  72. return $oss->ossClient->uploadContent($ossKey, $content, $options);
  73. }
  74. /**
  75. * 使用阿里云内网直接上传变量内容
  76. * @param string bucket名称
  77. * @param string 上传之后的 OSS object 名称
  78. * @param string 上传的变量
  79. * @return boolean 上传是否成功
  80. */
  81. public static function privateUploadContent($bucketName, $ossKey, $content, $options = [])
  82. {
  83. $oss = new OSS(true);
  84. $oss->ossClient->setBucket($bucketName);
  85. return $oss->ossClient->uploadContent($ossKey, $content, $options);
  86. }
  87. /**
  88. * 使用外网删除文件
  89. * @param string bucket名称
  90. * @param string 目标 OSS object 名称
  91. * @return boolean 删除是否成功
  92. */
  93. public static function publicDeleteObject($bucketName, $ossKey)
  94. {
  95. $oss = new OSS();
  96. $oss->ossClient->setBucket($bucketName);
  97. return $oss->ossClient->deleteObject($bucketName, $ossKey);
  98. }
  99. /**
  100. * 使用阿里云内网删除文件
  101. * @param string bucket名称
  102. * @param string 目标 OSS object 名称
  103. * @return boolean 删除是否成功
  104. */
  105. public static function privateDeleteObject($bucketName, $ossKey)
  106. {
  107. $oss = new OSS(true);
  108. $oss->ossClient->setBucket($bucketName);
  109. return $oss->ossClient->deleteObject($bucketName, $ossKey);
  110. }
  111. /**
  112. * -------------------------------------------------
  113. *
  114. *
  115. * 下面不再分公网内网出 API,也不注释了,大家自行体会吧。。。
  116. *
  117. *
  118. * -------------------------------------------------
  119. */
  120. public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
  121. {
  122. $oss = new OSS();
  123. return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
  124. }
  125. public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
  126. {
  127. $oss = new OSS();
  128. return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
  129. }
  130. // 获取公开文件的 URL
  131. public static function getPublicObjectURL($bucketName, $ossKey)
  132. {
  133. $oss = new OSS();
  134. $oss->ossClient->setBucket($bucketName);
  135. return $oss->ossClient->getPublicUrl($ossKey);
  136. }
  137. // 获取私有文件的URL,并设定过期时间,如 \DateTime('+1 day')
  138. public static function getPrivateObjectURLWithExpireTime($bucketName, $ossKey, DateTime $expire_time)
  139. {
  140. $oss = new OSS();
  141. $oss->ossClient->setBucket($bucketName);
  142. return $oss->ossClient->getUrl($ossKey, $expire_time);
  143. }
  144. public static function createBucket($bucketName)
  145. {
  146. $oss = new OSS();
  147. return $oss->ossClient->createBucket($bucketName);
  148. }
  149. public static function getAllObjectKey($bucketName)
  150. {
  151. $oss = new OSS();
  152. return $oss->ossClient->getAllObjectKey($bucketName);
  153. }
  154. public static function getObjectMeta($bucketName, $ossKey)
  155. {
  156. $oss = new OSS();
  157. return $oss->ossClient->getObjectMeta($bucketName, $ossKey);
  158. }
  159. }
  160. 放入自动加载
  161. composer.json autoload -> classmap 处增加配置:
  162. autoload”: {
  163. classmap”: [
  164. app/services
  165. ]
  166. }
  167. 然后运行 composer dump-autoload

获取文件路径

创建控制器类 Util/UploadController 控制器用于接收前台上传的图片,上传到阿里云OSS,并且拿到返回路径。Bucket名称名称换成自己的

  1. 控制器的使用
  2. namespace App\Http\Controllers\Util;
  3. use App\Http\Controllers\Controller;
  4. use App\Services\OSS;
  5. use Illuminate\Http\Request;
  6. class UploadController extends Controller
  7. {
  8. public function upload(Request $request)
  9. {
  10. //获取上传的文件
  11. $file = $request->file('file');
  12. //获取上传图片的临时地址
  13. $tmppath = $file->getRealPath();
  14. //生成文件名
  15. $fileName = str_random(5) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
  16. //拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
  17. $pathName = date('Y-m/d').'/'.$fileName;
  18. //上传图片到阿里云OSS
  19. OSS::publicUpload('Bucket名称', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
  20. //获取上传图片的Url链接
  21. $Url = OSS::getPublicObjectURL('Bucket名称', $pathName);
  22. // 返回状态给前端,Laravel框架会将数组转成JSON格式
  23. return ['code' => 0, 'msg' => '上传成功', 'data' => ['src' => $Url]];
  24. }
  25. }
  26. //模型使用,控制器调取使用即可
  27. <?php
  28. namespace App\Model;
  29. use App\Services\OSS;
  30. use Illuminate\Database\Eloquent\Model;
  31. use Illuminate\Http\Request;
  32. class design extends Model
  33. {
  34. protected $table="";
  35. public $timestamps = false;
  36. public static function uploadOss($file)
  37. {
  38. if (!$file) {
  39. exit("请上传图片");
  40. }
  41. // 文件是否上传成功
  42. if ($file->isValid()) {
  43. // 获取文件相关信息
  44. $originalName = $file->getClientOriginalName(); // 文件原名
  45. $ext = $file->getClientOriginalExtension(); // 扩展名
  46. $realPath = $file->getRealPath(); //临时文件的绝对路径
  47. $type = $file->getClientMimeType(); // image/jpeg
  48. $content = date('Y-m-d H:i:s') . '-' . uniqid() . '.' . $ext;
  49. //上传图片到阿里云OSS
  50. OSS::publicUpload('$Bucket名字', $content, $realPath, ['ContentType' => $file->getClientMimeType()]);
  51. //获取上传图片的Url链接
  52. $Url = OSS::getPublicObjectURL('$Bucket名字', $content);
  53. // 返回结果
  54. if($Url){
  55. return $Url;
  56. }else{
  57. return exit('文件上传失败');
  58. }
  59. }
  60. }
  61. }

发表评论

表情:
评论列表 (有 0 条评论,570人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图片阿里oss保存

    互联网新时代,除了纯信息展示类的网站,基本都是有文件上传功能的。但是随着业务的发展,如果上传的文件和数据库都和网站程序源代码放在一起,那是有相当多的弊端的。 1:用户体验比较