从微信服务器下载图片和音频到本地

根据

$source = 'http://file.api.weixin.qq.com/cgi-bin/media/get?access_token='.$access_token .'&media_id='.$media_id;

下载媒体资源。

下载图片

            //下载图片的方法
            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$source);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//是否显示头信息
            curl_setopt($ch,CURLOPT_SSLVERSION,3);//传递一个包含SSL版本的长参数
            $data = curl_exec($ch);// 执行一个cURL会话
            $error = curl_error($ch);//返回一条最近一次cURL操作明确的文本的错误信息。
            curl_close($ch);//关闭一个cURL会话并且释放所有资源
            //保存到本地的路径
            $destination = './img/'.$media_id.'.jpg';
            $file = fopen($destination,"w+");
            fputs($file,$data);//写入文件
            fclose($file);

下载音频

            //下载音频
            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$source);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//是否显示头信息
            curl_setopt($ch,CURLOPT_SSLVERSION,3);//传递一个包含SSL版本的长参数
            $data = curl_exec($ch);// 执行一个cURL会话
            $error = curl_error($ch);//返回一条最近一次cURL操作明确的文本的错误信息。
            curl_close($ch);//关闭一个cURL会话并且释放所有资源
            //保存到本地的路径
            $destination = './audio/'.$media_id.'.amr';
            $file = fopen($destination,"w+");
            fputs($file,$data);//写入文件
            fclose($file);

本地上传AMR音频到七牛云并转码成mp3格式

Laravel框架下composer安装七牛云

composer require qiniu/php-sdk

参照:https://github.com/qiniu/php-sdk/

<?php
namespace App\Tools\Api\Qiniu;

require_once('autoload.php');
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use Qiniu\Storage\BucketManager;

class UploadAudio
{
   public function upload($filePath,$mediaid)
   {
       //参数
       $accessKey = env('QINIU_ACCESSKEY');
       $secretKey = env('QINIU_SECRETKEY');
       $bucket = env('QINIU_BUCKET');
       //数据处理队列,这里不设置表示公有队列
       //$pipeline = env('QINIU_PIPELINE');
       $auth = new Auth($accessKey, $secretKey);
       $savekey = \Qiniu\base64_urlSafeEncode($bucket . ':' . $mediaid . '.mp3');
       //转码参数
       $fops = "avthumb/mp3/ab/320k/ar/44100/acodec/libmp3lame";
       $fops = $fops . '|saveas/' . $savekey;
       if (!empty($pipeline)) {  //使用私有队列
           $policy = array(
               'persistentOps' => $fops,
               'persistentPipeline' => $pipeline
           );
       } else {                  //使用公有队列
           $policy = array(
               'persistentOps' => $fops
           );

           //指定上传转码命令
           $uptoken = $auth->uploadToken($bucket, null, 3600, $policy);
           $key = $mediaid . '.mp3';
           $uploadMgr = new UploadManager();
           //上传文件并转码
           list($ret, $err) = $uploadMgr->putFile($uptoken, $key, $filePath);
           if ($err != null) {
               return false;
           } else {
               return true;
           }
       }
   }
}

?>

踩过的坑:

  1. 公有队列转码易堵塞,导致转码不能及时成功。用私有队列转码需设置多媒体处理
  2. 上传的源文件和转码后的文件名如果相同易出现覆盖前文件不成功的情况,导致转码失败

参考:

laravel框架的扩展封装了七牛云的php-sdk:https://packagist.org/packages/zgldh/qiniu-laravel-storage