大文件上传时,往往需要的处理时间会很长,同时可能会出现用户中途取消,网络断开等问题。使用HTML5的切片上传技术会有效改善大文件上传时的用户体验,基于Php Laravel后端框架和AetherUpload-Laravel这个组件,本文尝试去建立一个覆盖前后端的大文件上传方案。
环境Php Laravel 5.8
AetherUpload-Laravel 2.0
前端配置
Tips:前端代码中还涉及到了Bootstrap, jasny-bootstrap, Creative-Tim Argon的CSS主题,不影响本文相关的配置代码逻辑
@if($path === '')
上传视频
style="box-shadow: 0 1px 3px rgba(50, 50, 93, .15), 0 1px 0 rgba(0, 0, 0, .02);">
选择视频
更换视频
οnchange="console.log('更换视频');aetherupload(this).setGroup('file').setSavedPathField('#aetherupload-savedpath').setPreprocessRoute('/aetherupload/preprocess').setUploadingRoute('/aetherupload/uploading').setLaxMode(false).success(someCallback).upload()"/>
@else
@endif
// success(someCallback)中声名的回调方法需在此定义,参数someCallback可为任意名称,此方法将会在上传完成后被调用
// 可使用this对象获得resourceName,resourceSize,resourceTempBaseName,resourceExt,groupSubdir,group,savedPath等属性的值
someCallback = function () {
// Example Code
$('#result').append(
'
执行回调 - 文件已上传,原名:' + this.resourceName + ' | 大小:' + parseFloat(this
.resourceSize / (1000 * 1000)).toFixed(2) + 'MB' + ' | 储存名:' + this.savedPath
.substr(this.savedPath.lastIndexOf('_') + 1) + '
');
// Allow reupload video 允许再次上传新视频覆盖原有的
$('#aetherupload-resource').attr('disabled', false);
// Update Video info 像后台更新本次上传的视频信息
var video_path = $('#aetherupload-savedpath').val();
var id = $('#video_id').val();
var path = "/admin/videos/" + id + '/path';
$.ajax({
type: "put",
url: path,
data: {'path' : video_path},
success: function (data) {
// location.reload();
// toastr.success('Success');
}
});
}
后端配置public function updatePath(Request $request, $id){
$video = Video::find($id);
if($video->path !== ''){
\AetherUpload\Util::deleteResource($video->path);
}
$video->path = $request->path;
if($video->save()){
return redirect()->back()->withInput()->with('message', '更新视频成功');
}else{
return redirect()->back()->withInput()->withErrors('更新视频失败');
};
}
其余的一些操作的配置:获得已上传资源的访问链接(手动)通过请求路由”域名(分布式启用时应当为储存服务器的域名)/aetherupload/display/“+file1 访问file1
(自动)通过全局帮助方法 aetherupload_display_link(file1) 访问file1
(自动)通过工具类方法 AetherUploadUtil::getDisplayLink(file1) 访问file1
获得已上传资源的下载链接(手动)通过请求路由”域名(分布式启用时应当为储存服务器的域名)/aetherupload/download/“+file1+”/newname” 下载file1
(自动)通过全局帮助方法 aetherupload_download_link(file1,newname) 下载file1
(自动)通过工具类方法 AetherUploadUtil::getDownloadLink(file1,newname) 下载file1
删除资源
AetherUploadUtil::deleteResource($savedPath); //删除对应的资源文件
AetherUploadUtil::deleteRedisSavedPath($savedPath); //删除对应的redis秒传记录。