0

各位见笑了,本人菜鸟。

我按七牛的文档,用thinkphp生成uptoken,前端用七牛的JS SDK,这样前端可以上传文件到七牛并自动转码。这个过程已成功。
但前端并不知道上传的文件 何时才能转码成功。七牛的文档中写可以用persistentNotifyUrl 接收持久化处理结果通知的 URL。

是不是相当于要在thinkphp中写一个 public function??
不明白persistentNotifyUrl 对应的接收回调通知的php方法怎么写??

另外不明白的是,thinkphp后端 成功接收持久化处理结果通知 之后,前端怎么知道??后端会让前端刷新吗??
例如用户在前端成功上传文件,后端成功接收持久化处理结果通知,但前端页面是用户已打开的,如果不刷新,即使收到了通知,前端怎么知道??

文档是这么说的:

接收持久化处理结果通知的 URL。必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL。该 URL 获取的内容和持久化处理状态查询的处理结果一致。发送 body 格式是 Content-Type 为 application/json 的 POST 请求,需要按照读取流的形式读取请求的 body 才能获取。

以下是thinkphp后端代码:

    public function support_music_record(){
        $up_qn_conf_audio =C('up_qn_conf_audio'); 
        $up_qn_audio = new \Think\Upload\Driver\Qiniu\QiniuStorage($up_qn_conf_audio);  //实例化上传类 

        $persistentOps = "avthumb/m4a/ab/64k/ar/11025";  //转码策略
        $date_today=date("ymd");
        $encoded_name = 'ac_64/'.$id.'_'.$date_today; //作品编号+日期,设置文件名前缀,用于生命周期的管理 
        $save_key_encoded=base64_urlSafeEncode($up_qn_conf_audio['bucket'].':'.$encoded_name.'.m4a');
        $persistentOps = $persistentOps.'|saveas/'.$save_key_encoded;  //指定的Bucket中存在同Key的文件将会被处理结果覆盖

        $save_key_original='ao_1/'.$id.'_'.$date_today.'$(ext)';  //1天后删除上传后的原文件
        $save_name_original='ao_1/'.$id.'_'.$date_today;  //1天后删除上传后的原文件
        
        $policy = array( 
            'scope'=>$up_qn_conf_audio['bucket'].':'.$save_name_original, //允许修改,若已存在同名资源则会被覆盖
            'deadline'=>3600,
            'insertOnly'=>0,  //非新增模式            
            'persistentOps' => $persistentOps, 
            'persistentPipeline' => $up_qn_conf_audio['pipeline'], 
            'fsizeLimit'=>5000000,
            'mimeLimit'=>"audio/mp3;audio/mpeg;audio/mpg;audio/x-mp3;audio/x-mpeg;audio/x-mpg;audio/mp4;audio/MP4A-LATM;audio/x-m4a",
            'forceSaveKey'=>false, //为true时,会忽略客户端指定的key,强制使用saveKey进行文件命名
            'saveKey'=> $save_key_original, //若forceSaveKey为false,优先以客户端已指定Key命名,如客户端未指定则以saveKey命名。
        ); 

        $uptoken=$up_qn_audio->UploadToken($up_qn_conf_audio['secretKey'], $up_qn_conf_audio['accessKey'], $policy);
        

        $this->assign(array( //指派标签
            'uptoken'=> $uptoken, 
            'domain'=> $up_qn_conf_audio['domain'], 
            'save_key_original'=>$save_key_original, 
            'save_name_original'=>$save_name_original, 
        ));
        $this->display();
    }
young8704 170
2019-09-27 提问

1 个回答

0

已采纳

1.回调本质是云端发送一个post请求到persistentNotifyUrl(服务器用于接收回调的接口),在post请求的body中包含回调内容,所以服务器接收回调就是实现一个能接收post请求的接口,至于php如何接收post请求,可以百度下,网上有很多教程。
2.前后端分离的架构,可以通过异步ajax请求获取数据,然后展示到前端动态更新

推广链接