Laravel5.7 使用 AliyunOSS 上传
对象存储 ( Object Storage Service, 简称 OSS ) OSS 相信大家都听过, 它是阿里云对外提供的海量, 安全和高可靠的云存储服务. 大家可以把自己网站的资源存上面加快自己网站速度, 阿里云 官网也有文档不过对于新手来说有点难, 那么这里我给大家推荐一个组件和组件的使用.
这里使用到的前端上传组件layui
上传aliyun组件使用的是johnlui/AliyunOSS
安装
composer require johnlui/aliyun-oss:~2.0
构建 Service 文件
新建 app/services/OSS.php
内容可参考: OSS.php
,只需要修改下面的信息,变成自己的阿里云AccessKeyId
AccessKeySecret
即可
private $city = '青岛';
private $networkType = '经典网络';
//此处修改成成阿里云的AccessKeyId AccessKeySecret
private $AccessKeyId = '';
private $AccessKeySecret = '';
private $ossClient;
放入自动加载
在 composer.json
中 autoload -> classmap
处增加配置:
"autoload": {
"classmap": [
"app/services"
]
}
然后运行 composer dump-autoload
。
获取文件路径
创建控制器类 Util/UploadController
控制器用于接收前台上传的图片,上传到阿里云OSS,并且拿到返回路径,需要注意的是下面代码中publicUpload
getPublicObjectURL
方法后面第一个参数要换成阿里云OSS Bucket
名称即可.
namespace App\Http\Controllers\Util;
use App\Http\Controllers\Controller;
use App\Services\OSS;
use Illuminate\Http\Request;
class UploadController extends Controller
{
public function upload(Request $request)
{
//获取上传的文件
$file = $request->file('file');
//获取上传图片的临时地址
$tmppath = $file->getRealPath();
//生成文件名
$fileName = str_random(5) . $file->getFilename() . time() .date('ymd') . '.' . $file->getClientOriginalExtension();
//拼接上传的文件夹路径(按照日期格式1810/17/xxxx.jpg)
$pathName = date('Y-m/d').'/'.$fileName;
//上传图片到阿里云OSS
OSS::publicUpload('Bucket名称', $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]);
//获取上传图片的Url链接
$Url = OSS::getPublicObjectURL('Bucket名称', $pathName);
// 返回状态给前端,Laravel框架会将数组转成JSON格式
return ['code' => 0, 'msg' => '上传成功', 'data' => ['src' => $Url]];
}
}
前端Layui代码
我们使用的Laravel
框架请求需要携带令牌所以我们需要在header
和js
上携带令牌,获取到后端return
的返回接口可以在res
接收返回的阿里云地址,创建form
表单将res
返回的地址使用jquery
改变input
的值,并且触发提交
<meta name="csrf-token" content="{{ csrf_token() }}">
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>
<script>
layui.use('upload', function () {
var $ = layui.jquery
, upload = layui.upload;
//普通图片上传
var uploadInst = upload.render({
elem: '#test1'
, url: '{{route('util.upload')}}'
, accept: 'images'
, before: function (obj) {
//预读本地文件示例,不支持ie8
obj.preview(function (index, file, result) {
$('#icon').attr('src', result); //图片链接(base64)
});
}
, done: function (res) {
//如果上传失败
if (res.code > 0) {
return layer.msg('上传失败');
}
//上传成功
if (res.code == 0) {
console.log(res.data.src);
$('#iconUrl').val(res.data.src);
$('#saveIcon').submit()
}
}
, error: function () {
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
demoText.find('.demo-reload').on('click', function () {
uploadInst.upload();
});
}
});
});
</script>
注意
1.OSS.php
文件中 private $city = '青岛';
所对应的城市,要根据自己OSS相对应的地区所选择,如何查看自己的OSS地区,请到阿里云OSS中查看,修改错误会导致无法连接到阿里云OSS服务器
2.使用homestead
小伙伴需要把config/app
文件中 timezone
修改成 PRC
'timezone' => 'PRC',
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: