Laravel5.7+ 使用 AliyunOSS 上传
这里使用到的前端上传组件 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',

浙公网安备 33010602011771号