视频分片上传

视频分片上传

# 基本原理
# 简单说就是将大文件分片上传,完成后再将所有分片进行合并。

/**
 * 资源上传控制器
 * ThinkPHP5 
 */
class Upload extends Common
{
    protected $chunk; // 当前上传文件的分片数
    protected $chunks; // 总分片数
    protected $savepath; // 保存地址
    protected $filename; // 文件名
    protected $filesize; // 文件大小

    /**
     * 构造函数
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * 视频分片上传
     */
    public function videoChunk()
    {
        // 这里需要注意的就是设置分配的最大内存不得小于允许的最大上传文件
        set_time_limit(0);
        ini_set('memory_limit', '1024M');

        // 获取文件相关信息,前端需要提交相关的文件信息
        $this->chunk = input('chunk');
        $this->chunks = input('chunks');
        $this->savepath = '/data/video/' . date('Ymd');
        $this->filename = input('name');
        $this->filesize = input('filesize');

        // 验证文件大小
        if ($this->filesize > (1 * 1024 * 1204 * 1024)) {
            response(401, '请不要上传超过 1G 的视频!');
        }

        // 接受上传分片
        $tmpname = $this->filename . '.tmp' . $this->chunk;
        $video = request()->file('video');
        // 判断是否有上传文件,存在则执行上传
        if ($video) {
            $info = $video->move($this->savepath, $tmpname);
            // 判断是否为最后一块,若是则合并
            if ($this->chunk == ($this->chunks - 1)) {
                $blob = '';
                for($i=0; $i< $this->chunks; $i++){
                    $blob .= file_get_contents($this->savepath. '/' . $this->filename . '.tmp' . $i);
                }
                file_put_contents($this->savepath . '/' . $this->filename, $blob);
                
                // 删除文件分片
                for ($i=0; $i< $this->chunks; $i++) {
                  @unlink($this->savepath . '/' . $this->filename . '.tmp' . $i);
                }

                response(200, '上传成功!', ['path' => $this->savepath . '/' . $this->filename]);
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值