在现在的互联网背景下继续学习 layui 其实并不是一件很明智的事情。除非你真的很需要 layui 帮你快速解决问题,否则请考虑其他更专业的选择。
后端部分
后端PHP使用 iidestiny/laravel-filesystem-oss
,对前端直传
有着良好的支持。这里不再赘述。
前端部分
前端使用 layui
框架的upload
功能。upload
对OSS不存在任何支持,但好在在文件选择后的回调中,我们可以直接对upload
对象进行修改,来达到我们的目的。接下来开始上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| let layLoading; var uploadInst = upload.render({ elem: '#image-upload' , url: '/upload/' , choose: function (obj) { layLoading = layer.load();
$.ajax({ method: "POST", url: "", async: false, done: function (signRes) { uploadInst.config.url = signRes.data.oss_config.host uploadInst.config.data = { OSSAccessKeyId: signRes.data.oss_config.accessid , policy: signRes.data.oss_config.policy , Signature: signRes.data.oss_config.signature , key: signRes.data.oss_upload_advance.name } }, }); } , before: function (obj) { obj.preview(function (index, file, result) { $('#cover-upload-img').attr('src', result).attr('style', '{display:inline}'); }); } , done: function (res) { layer.closeAll();
} , error: function () { var coverUploadText = $('#cover-upload-text'); coverUploadText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-mini cover-upload-reload">重试</a>'); coverUploadText.find('.cover-upload-reload').on('click', function () { uploadInst.upload(); }); layer.closeAll(); } });
|
layui 直传支持
此时点击上传会看到阿里云关于 key 的报错。因为阿里云要求上传的文件 file 必须是在最后一位
,而layui
的处理正好是先把 file 放到第一位
。所以我们还需要修改 layui 的源代码
:
找到layui/lay/modules/upload.js
。无论你的代码是方便修改的源代码,还是构建过的源代码,都可以直接全文搜索append
,一共会搜到四个append
,将第三个append
所在的逻辑块与第四个append
所在的逻辑块对调,就能实现将file
字段移动到最后一位。
1 2 3
| layui.each(l.data, function (e, t) { t = "function" == typeof t ? t() : t, r.append(e, t) }),r.append(l.field, o);
|
前两个append
是涉及ie8,ie9的兼容模式
。这里暂不做讨论。