七牛クラウドの持続化アップロード画像とサムネイルの生成、マルチファイルのパッケージダウンロード

6612 ワード

私のブログwww.kevinkへようこそ.club,php,swoole,golang,redisなどをタイミングで更新
コードを書く前に、七牛雲のDEMOにツッコミを入れたいのですが、確かにあまり書いていません.
くだらないことはあまり言わないで、始めましょう.
プロジェクトフレームワークTP 5.1、前に他の人が少し書いたが、七牛雲のSDKカタログを直すのがおっくうで、強迫症患者は我慢して見ましょう.
qiniuのphpSDKはvendorフォルダの下に置かれています.
1.永続化処理によるサムネイルのアップロードおよび生成.アップロードした画像は20 M+大きいので、持続化処理を採用してアップロードし、putfile 20 Mの画像はアップロードさせません.
新Filenameは七牛雲に保存された原図keyで、
oldFilePathサーバ上のピクチャのアドレス、サーバキャッシュ内のアドレス
persistentops:ピクチャに対する操作で、複数の操作があれば使用し、隔てます. 
persistentNotifyUrlは非同期で返される通知アドレスであり、この方法ではサーバにサムネイルを保存し、7牛クラウド上のサムネイルを削除することです.
完了した操作:原図のkeyを設定し、原図を保存した後、200*200のサムネイルを生成して七牛雲に保存します.
private function uploadImgPost($newFilename, $oldFilepath){
        set_time_limit(0);
        $t1 = microtime(true);
        require_once APP_PATH . '/../vendor/qiniu/autoload.php';
        //       
        $auth = new Auth($this->accessKey, $this->secretKey);
        //       key
        $explode = explode(".", $newFilename);
        $thumbKey = $explode[0] . "_thumb" .".". $explode[1];
        $entry = $this->bucket .":". $thumbKey;
        $encodedEntryURI = \Qiniu\base64_urlSafeEncode($entry);
        $array = [
            'persistentOps'=>'imageView2/2/w/200/h/200/q/70/ignore-error/1/|saveas/'.$encodedEntryURI,        //      200*200    ,       
            'persistentNotifyUrl'=> url('appindex/Files/uploadImgNotify', '', true, true),
        ];
        //    Token
        $token = $auth->uploadToken($this->bucket, null, 3600, $array );
        //     UploadManager           
        $uploadMgr = new UploadManager();
        //    UploadManager   putFile          
        list($ret, $err) = $uploadMgr->putFile($token, $newFilename, $oldFilepath);
        if ($err !== null) {
            return ['code' => -1, 'msg' =>'    '];
        } else {
            $t2 = microtime(true);
            file_put_contents('time.log', "       :" . ($t2 - $t1) . " ", FILE_APPEND );
            //       URL
            $newFilepath = $this->httpPre . $this->domain . "/" . $ret['key'];
            //         
            $thumbUrl = $this->getThumbUrlFromQiniuKey($ret['key']);
            return ['code' => 1, 'msg' => '    ', 'data' => ['url'=> $newFilepath, 'previewUrl' => $thumbUrl]];
        }
    }

次のコードは非同期メソッドです.
deleteFileの方法は貼らないで、七牛雲にあって、簡単です.
最後にjson文字列の通知を返します.そうしないと、マルチメディアキューに失敗が表示されます. 
   /**
     *      ,            ,             
     * Function uploadImgNotify
     * @author mselect <[email protected]>
     * @DateTime 2019/5/16
     */
    public function uploadImgNotify(){
        $arr = $this->request->param();
        if( !empty($arr['code']) && $arr['code'] == 0 ){
            //  
            $items = $arr['items'];
            $path = ROOT_PATH . $this->thumbSavePath;

            if(!is_dir($path)){
                mkdir($path, 0777, true);
            }

            foreach($items as $item){
                if(strpos($item['cmd'], 'saveas') !== false){
                    //     ,    
                    $url = $this->httpPre . $this->domain . '/' . $item['key'];
                    $back = file_put_contents($path . $item['key'] , file_get_contents($url));
                    if($back <=0 ){
                        unlink($path . $item['key']);
                    }else {
                        //             
                        $this->deleteFile($item['key']);
                    }
                }
            }
            $resp = array('ret' => 'succeed');
        }else {
            $resp = array('ret' => 'failed');
        }
        return json($resp);
    }

2.マルチファイルパッケージzipダウンロード
keysは、パッケージするファイルをすべて保存したkey配列です.
zipKeyは七牛雲に保存された圧縮パッケージkey
完了:keys配列のすべてのファイルをzipにパッケージ化し、7牛クラウドに保存し、非同期通知方法で圧縮パッケージをダウンロードします.
pipelineが独自に作成したマルチメディアキュー名
key = test.zipこれはピットです.このファイルはデフォルトのファイルです.testをアップロードする必要があります.zip(小さな圧縮バッグを勝手にアップロード)は七牛雲に.
    /**
     *
     *               zip  
     * Function mkzip
     * @author mselect <[email protected]>
     * @DateTime 2019/5/13
     * @param $keys       array            
     */
    public function mkzip($keys, $zipKey){

        require_once APP_PATH . '/../vendor/qiniu/autoload.php';
        $auth = new Auth($this->accessKey, $this->secretKey);
        $pipeline = 'mkzip';
        $key =  "test.zip"; //d5b37d559fbec90b0cdc_water
        $pfop = new PersistentFop($auth, null);
        $fops = 'mkzip/2';
        foreach($keys as $value){
            $fops .= '/url/' . \Qiniu\base64_urlSafeEncode($value);
        }
        $zipKey = $zipKey . ".zip";
        $fops .= '|saveas/' . \Qiniu\base64_urlSafeEncode($this->bucket . ":" . $zipKey);
        $notify_url = url('appindex/Files/mkzipNotify', '', true, true);
        $force = false;
        list($id, $err) = $pfop->execute($this->bucket, $key, $fops, $pipeline, $notify_url, $force);
        file_put_contents('imgwater.log', "    ID: $id ,     :$notify_url \r
", FILE_APPEND); if($err !==null){ return ['code' => -1, 'msg' => ' ']; }else { // while(true){ $url = "http://api.qiniu.com/status/get/prefop?id=" . $id; $json = file_get_contents($url); $arr = json_decode($json, true); if($arr['code'] == 0 ){ break; }else if($arr['code'] == 3 || $arr['code'] == 4){ file_put_contents('imgwater.log', $arr['desc'] . "\r
", FILE_APPEND); return ['code' => -1, 'msg'=> $arr['desc']]; } } return ['code' => 1, 'msg' => ' ', 'data' => ['fileKey' => $this->httpPre . $this->domain . "/" . $zipKey]]; } }

圧縮パッケージのダウンロード方法と
以上の非同期通知方法は類似しており,後述しない.
ようこそhttp://www.kevink.club詳細を表示
以上の方法に問題があれば、すぐに連絡してください.