Laravel 使用 Aliyun OSS 云存储

对象存储 ( Object Storage Service, 简称 OSS ) OSS 相信大家都听过, 它是阿里云对外提供的海量, 安全和高可靠的云存储服务. 大家可以把自己网站的资源存上面加快自己网站速度, aliyun 官网也有文档不过对于新手来说有点难, 那么这里我给大家推荐一个组件和组件的使用.

johnlui/aliyun-oss 这个组件是 John Lui 作者封装好的组件, 用法超简单, 不过这个组件有许多要注意的地方, 不然出错了, 掉坑里爬不出来!

安装

composer require "johnlui/aliyun-oss"  

配置

组件下载完成之后, 作者的 GitHub 上面说需要在 app/config/app.php 中增加四项配置, 我建议在 app/config 下面新建一个 alioss.php 文件然后在添加配置:

<?php  
return [  'ossServer' => env('ALIOSS_SERVER', null),                      // 外网'ossServerInternal' => env('ALIOSS_SERVERINTERNAL', null),      // 内网'AccessKeyId' => env('ALIOSS_KEYID', null),                     // key'AccessKeySecret' => env('ALIOSS_KEYSECRET', null),             // secret'BucketName' => env('ALIOSS_BUCKETNAME', null)                  // bucket
];

然后在 .ENV 文件里面把配置信息都填上.

注意

这里有一个大坑, 粗心的朋友一般不会发现, 在填写外网和公网配置的时候, 有的朋友直接在 OSS 管理控制台中把外网和内网一长串的链接复制走, 如下图:

file

在这个组件中, 桶名称是需要额外填写的, 所以外网和内网哪儿, 只需要填写桶名后面的内容, 如图:

file

再有一点是填写外网和内网的时候需要加上 http:// 协议, 不然后面出错你又得掉坑半天出不来, 最终配置信息如下图:

file

构建 Service 文件

后台需要一个 Service 文件, 在 app/Service 下新建一个 oss.php 文件, 由于前面步骤我把配置文件放在 app/config/alioss.php 里面, 所以还要对原作者给出的例子作修改下, 如下代码:

# oss.php
<?phpnamespace App\Services;use JohnLui\AliyunOSS\AliyunOSS;class OSS  
{private $ossClient;private static $bucketName;public function __construct($isInternal = false){$serverAddress = $isInternal ? config('alioss.ossServerInternal') : config('alioss.ossServer');$this->ossClient = AliyunOSS::boot($serverAddress,config('alioss.AccessKeyId'),config('alioss.AccessKeySecret'));}public static function upload($ossKey, $filePath){$oss = new OSS(false); // 上传文件使用内网,免流量费$oss->ossClient->setBucket(config('alioss.BucketName'));$res = $oss->ossClient->uploadFile($ossKey, $filePath);return $res;}/*** 直接把变量内容上传到oss* @param $osskey* @param $content*/public static function uploadContent($osskey, $content){$oss = new OSS(false); // 上传文件使用内网,免流量费$oss->ossClient->setBucket(config('alioss.BucketName'));$oss->ossClient->uploadContent($osskey, $content);}/*** 删除存储在oss中的文件** @param string $ossKey 存储的key(文件路径和文件名)* @return*/public static function deleteObject($ossKey){$oss = new OSS(false); // 上传文件使用内网,免流量费return $oss->ossClient->deleteObject(config('alioss.BucketName'), $ossKey);}/*** 复制存储在阿里云OSS中的Object** @param string $sourceBuckt 复制的源Bucket* @param string $sourceKey - 复制的的源Object的Key* @param string $destBucket - 复制的目的Bucket* @param string $destKey - 复制的目的Object的Key* @return Models\CopyObjectResult*/public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey){$oss = new OSS(true); // 上传文件使用内网,免流量费return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);}/*** 移动存储在阿里云OSS中的Object** @param string $sourceBuckt 复制的源Bucket* @param string $sourceKey - 复制的的源Object的Key* @param string $destBucket - 复制的目的Bucket* @param string $destKey - 复制的目的Object的Key* @return Models\CopyObjectResult*/public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey){$oss = new OSS(true); // 上传文件使用内网,免流量费return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);}public static function getUrl($ossKey){$oss = new OSS();$oss->ossClient->setBucket(config('alioss.BucketName'));return $oss->ossClient->getUrl($ossKey, new \DateTime("+1 day"));}public static function createBucket($bucketName){$oss = new OSS();return $oss->ossClient->createBucket($bucketName);}public static function getAllObjectKey($bucketName){$oss = new OSS();return $oss->ossClient->getAllObjectKey($bucketName);}/*** 获取指定Object的元信息** @param  string $bucketName 源Bucket名称* @param  string $key 存储的key(文件路径和文件名)* @return object 元信息*/public static function getObjectMeta($bucketName, $osskey){$oss = new OSS();return $oss->ossClient->getObjectMeta($bucketName, $osskey);}}

使用

首先引入命名空间 use App\Services\OSS;, 在 Laravel 5.1 中使用方法如下

// 获取表单提交的图片
$pic = $request->file('pic');
// 判断图片有效性
if (!$pic->isValid()) {  return back()->withErrors('上传图片无效..');
}
// 获取图片在临时文件中的地址
$pic = $pic->getRealPath();
// 制作文件名
$key = time() . rand(10000, 99999999) . '.jpg';
//阿里 OSS 图片上传
$result = OSS::upload($key, $pic);
if ($result) {  // success
} else {// fail
}

注意: 如果你上传长时间没反应的话, 说明你上传使用的是内网, 你得改成外网上传, 找到 Service/oss.php 里面的 upload 方法, 将 $oss = new OSS(true); true 改为 false, 上传程序即可成功!

附上其他使用方法

OSS::upload('文件名', '本地路径'); // 上传一个文件echo OSS::getUrl('某个文件的名称'); // 打印出某个文件的外网链接OSS::createBucket('一个字符串'); // 新增一个 Bucket。注意,Bucket 名称具有全局唯一性,也就是说跟其他人的 Bucket 名称也不能相同。OSS::getAllObjectKey('某个 Bucket 名称'); // 获取该 Bucket 中所有文件的文件名,返回 Array。  

原文出处

转载于:https://www.cnblogs.com/jhcyzxx/p/10479898.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/449732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线学习新编程 技巧全攻略

摘要&#xff1a;有句俗语叫&#xff1a;“技多不压身”&#xff0c;如果你有时间和兴趣&#xff0c;不妨多了解和掌握编程技能&#xff0c;或许随时可能有用。本文为你收集了一些编程技巧&#xff0c;让你轻松学编程。 有句俗语叫&#xff1a;“技多不压身”&#xff0c;如果你…

第 3 章 镜像 - 018 - 镜像命名的最佳实践

为镜像命名 创建镜像时 docker build 命令时已经为镜像取了个名字&#xff0c;例如&#xff1a; docker build -t ubuntu-with-vi 这里的 ubuntu-with-vi 就是镜像的名字。通过 dock images 可以查看镜像的信息。 1 rootubuntu:~# docker images ubuntu-with-vi 2 REPOSITORY …

Jmeter逻辑控制器-ForEach Controller

ForEach Controller 介绍 ForEach Contoller 即循环控制器&#xff0c;顾名思义是定义一个规则。主要有以下一个参数&#xff1a;名称&#xff1a;随便填写注释&#xff1a;随便填写输入变量前缀&#xff1a;可以在“用户自定义变量”中定义一组变量。循环控制器可以从中获取到…

微服务实战(三):深入微服务架构的进程间通信

见&#xff1a;http://www.dockone.io/article/549简介 在单体式应用中&#xff0c;各个模块之间的调用是通过编程语言级别的方法或者函数来实现的。但是一个基于微服务的分布式应用是运行在多台机器上的。一般来说&#xff0c;每个服务实例都是一个进程。因此&#xff0c;如下…

python输出与删除某行或某列

python输出字符&#xff0c;主要为结合变量形成新的变量名 year 2016 event Referendum fResults of the {year} {event}Results of the 2016 Referendum yes_votes 42_572_654 no_votes 43_132_495 percentage yes_votes / (yes_votes no_votes) {:-9} YES votes {:2…

为什么应该用模块取代C/C++中的头文件?

摘要&#xff1a;本文整理自Apple C工程师Doug Gregor的演讲Slide&#xff0c;他表示希望使用模块&#xff08;Module&#xff09;这一概念替代C/C中的头文件&#xff0c;现已被C标准化委员会任命为Module研究组的主席&#xff0c;研究该提议的可能性。考虑到Apple的开源项目LL…

Kong Api 初体验、Kong安装教程

见&#xff1a;https://blog.csdn.net/forezp/article/details/79383631Kong是一个可扩展的开源API层&#xff08;也称为API网关或API中间件&#xff09;。 Kong运行在任何RESTful API的前面&#xff0c;并通过插件扩展&#xff0c;它们提供超出核心平台的额外功能和服务。 Kon…

从谷歌宕机事件认识互联网工作原理

摘要&#xff1a;谷歌服务器经历了短暂的宕机事件&#xff0c;持续大概27分钟&#xff0c;对部分地区的互联网用户造成了影响。此次事件的原因深究起来需要进入互联网络那深邃的、黑暗的角落。 译者注&#xff1a;本文中提到CloudFlare是一家总部位于美国旧金山的内容分发网络(…

推荐给开发人员的实用命令行工具

摘要&#xff1a;优秀的工具对于定位问题出在何处有着无可估量的价值&#xff0c;而且能在一开始就帮助我们阻止问题的出现&#xff0c;总的来说能使我们的工作更有效率。本文介绍了6个非常强大且灵活的工具&#xff0c;熟练使用这些工具能使你的生活变得更轻松一些。 作为一名…

雷军:启动手机+AIoT双引擎战略 5G春天到来前打持久战

雷帝网 乐天 1月11日报道 小米CEO雷军今日在小米年会上宣布&#xff0c;2019年&#xff0c;小米将正式启动“手机AIoT”双引擎战略&#xff0c;这将是小米未来五年的核心战略。未来5年&#xff0c;小米将在AIoT领域持续投入超过100亿元。从2019年起&#xff0c;AIoT&#xff0c…

Jenkins自定义主题

x下载自定义样式 http://afonsof.com/jenkins-material-theme/ 打开连接 最后点击&#xff1a;DOWNLOAD TOUR THEME! 得到样式文件&#xff1a;jenkins-material-theme.css 上传样式文件到jenkins 将jenkins-material-theme.css 上传到&#xff1a; /var/jenkins_home/userCont…

SSH (Secure Shell)详解

Secure Shell&#xff08;SSH&#xff09;是一种加密 网络协议&#xff0c;用于在不安全的网络上安全地运行网络服务。 SSH通过客户端 - 服务器体系结构中的不安全网络提供安全通道&#xff0c;将SSH客户端应用程序与SSH服务器相连接。 常见的应用程序包括远程命令行登录和远程…

2021-08-12 画蜡烛线

画蜡烛线 pip install https://github.com/matplotlib/mpl_finance/archive/master.zip from mpl_finance import candlestick_ochl import matplotlib.pyplot as plt from matplotlib.pylab import date2num# 先画日K线 fig, axes plt.subplots(nrows1, ncols1, figsize(20, …

通达信获取数据

#python第三方库pytdx获取 from pytdx.hq import TdxHq_API api TdxHq_API() # 数据获取接口一般返回list结构&#xff0c;如果需要转化为pandas Dataframe接口&#xff0c;可以使用 api.to_df 进行转化 with api.connect(119.147.212.81, 7709): # 返回普通list data …

股票数据相关性分析

导入相关包 import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.collections import LineCollection import akshare as ak from sklearn import cluster, covariance, manifold %matplotlib inline #Jupyter Notebook显示图形专用 plt…

分享一个辅助分析内存泄漏的脚本

最近给系统做了一点优化&#xff0c;前几天去查看系统监控&#xff0c;想看看上线前后cpu使用率曲线变化情况。查看的时候意外发现上线前后内存占用相差不少&#xff0c;20%以上。 本来我没怎么在意这个问题&#xff0c;因为我们系统会在运行过程中缓存部分数据内容。但客户觉得…

专访刘伟:软件开发人员的内功修炼之道

摘要&#xff1a;数学修养对软件开发之路起着什么作用&#xff1f;码农如何修炼自己的内功并成长为优秀的软件开发员&#xff1f;带着相关思考&#xff0c;社区之星第10期采访了中南大学副教授——刘伟。他对数学修养、设计模式、软件架构和重构方面的独特见解&#xff0c;相信…

地址解析协议 (ARP) 是什么

地址解析协议 (ARP) 是通过解析网路层地址来找寻数据链路层地址的一个在网络协议包中极其重要的网络传输协议。 ARP是通过网络地址(例&#xff1a;IPv4)来定位MAC地址 (也称为乙太地址)。 ARP已经在很多网路层和数据链接层之间得以实现&#xff0c;包括IPv4&#xff0c;Chaosn…

04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...

2019独角兽企业重金招聘Python工程师标准>>> 一.基本用法 在以类继承的方式定义的组件中&#xff0c;为了能方便地调用当前组件的其他成员方法或属性&#xff08;如&#xff1a;this.state&#xff09;&#xff0c;通常需要将事件处理函数运行时的 this 指向当前组件…

代码之美——Doom3源代码赏析

摘要&#xff1a;Dyad作者、资深C工程师Shawn McGrathz在空闲时翻看了Doom3的源代码&#xff0c;发出了这样的惊叹&#xff1a;“这是我见过的最整洁、最优美的代码&#xff01;”“Doom 3的源代码让我对那些优秀的程序员刮目相看。”因此有了本文。 背景介绍&#xff1a; Doom…