php大文件上传插件,基于Php Laravel的大文件HTML5分块上传

大文件上传时,往往需要的处理时间会很长,同时可能会出现用户中途取消,网络断开等问题。使用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()"/>

style=" background-color:#419DF9!important;">

@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秒传记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Golang 的 multipart 包来实现分块接收大文件上传的服务端。具体步骤如下: 1. 定义一个路由,处理客户端上传文件的请求,例如: ```go http.HandleFunc("/upload", uploadHandler) ``` 2. 在 uploadHandler 函数中,使用 multipart 包解析客户端发送的请求,获取上传文件的内容和信息,例如: ```go func uploadHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseMultipartForm(32 << 20) // 限制上传文件大小为 32MB if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } file, header, err := r.FormFile("file") // 获取上传文件的内容和信息 if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer file.Close() // 处理上传文件的内容和信息 // ... } ``` 3. 在处理上传文件的内容和信息时,可以将文件分块读取并保存到本地或者云端存储中,例如: ```go const ( maxChunkSize = 10 * 1024 * 1024 // 限制每个分块大小为 10MB ) func uploadHandler(w http.ResponseWriter, r *http.Request) { // ... totalSize := header.Size // 获取上传文件的总大小 chunks := int(math.Ceil(float64(totalSize) / float64(maxChunkSize))) // 计算需要分成几个块 for i := 0; i < chunks; i++ { chunkSize := maxChunkSize if i == chunks-1 { chunkSize = int(totalSize) - i*maxChunkSize // 最后一个块的大小可能不足 maxChunkSize } chunk := make([]byte, chunkSize) _, err := file.Read(chunk) // 读取分块内容 if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 将分块内容保存到本地或者云端存储中 // ... } // ... } ``` 这样就可以实现 Golang 分块接收大文件上传的服务端了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值