码迷,mamicode.com
首页 > 微信 > 详细

微信JSSDK上传图片,代码为上传单张图

时间:2020-04-03 18:36:48      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:ring   fail   ret   roo   red   本地   php   image   param   

HTML端

//这里需要注意的是,千万不要把onclick放到input file上
 <div class="load_box">
      <img src="ajax返回显示的图片,初始化可以设置个默认的URL"  alt=""  id="img1" class="star" style="height:142px;"  onclick="chooseImage(‘file1‘, ‘thumb‘, ‘img1‘)" >
        <input type="file"  name="fileToUpload" id="file1"  style="width: 0px; height:0px;">
         //隐藏域为了提交表单,post或get获取图片路径
         <input type="hidden"  name="thumb"  id="thumb" value=""/>
</div>

 <div class="load_box">
      <img src="ajax返回显示的图片,初始化可以设置个默认的URL"  id="img2"  style="height:142px;"   onclick="chooseImage(‘file2‘, ‘thumb1‘, ‘img2‘)">
      <input type="file"  name="fileToUpload" id="file2"  style="width: 0px; height:0px;">
       <input type="hidden"  name="thumb1"  id="thumb1" />
</div>

JS代码

//引入JSSDK文件
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js" ></script>

<script  type="text/javascript" >
   //这些配置,PHP生成
    wx.config({
        debug: false,
        appId: ‘<?php echo $aWechatConfig[‘appId‘] ?>‘,
        timestamp: ‘<?php echo $aWechatConfig[‘timestamp‘] ?>‘,
        nonceStr: ‘<?php echo $aWechatConfig[‘nonceStr‘] ?>‘,
        signature: ‘<?php echo $aWechatConfig[‘signature‘] ?>‘,
        jsApiList: [
            ‘chooseImage‘,
            ‘uploadImage‘
        ]
    });

    //上传图片
    function chooseImage(obj, fileid, imgid){
        //拍照或从手机相册中选图接口
        wx.chooseImage({
            count: 1, // 默认9
            sizeType: [‘original‘, ‘compressed‘],          // 可以指定是原图还是压缩图,默认二者都有[‘original‘, ‘compressed‘]
            sourceType: [‘album‘, ‘camera‘], // 可以指定来源是相册还是相机,默认二者都有
            success: function(res) {
                var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
//                alert(‘localIds:‘ + localIds);

                //http://blog.csdn.net/turbocc/article/details/61198447
                //在选择图片后,采用setTimeout(function(){wx.uploadImage()},100);可以解决android设备下的问题。
                setTimeout(function(){
                    //上传图片接口
                    wx.uploadImage({
                        //这块比较坑, localIds.toString(),必须转字符串,或者 ‘‘ + localIds
                        localId: localIds.toString(),       //需要上传的图片的本地ID,由chooseImage接口获得
                        isShowProgressTips: 1,           // 默认为1,显示进度提示
                        success: function(res) {
                            var serverId = res.serverId; // 返回图片的服务器端ID, 上传图片有效期3天,可用微信多媒体接口下载图片到自己的服务器,此处获得的 serverId 即 media_id。
//                            alert(‘serverId:‘ + serverId);
//                            调用ajax,走素材解口,保存图片到服务器
                            var url = ‘/weixin/mobile/ajax.inc.php?action=getwechatmedia‘;
                            var data = {
                                mediaId: serverId
                            };
                            $.post(url, data, function (result) {
                                if (result.success) {
                                    $(‘#‘+fileid).val(‘/uploadfile/‘+result.msg);
                                    $("#" + imgid).attr("src" , ‘/uploadfile/‘+result.msg);
                                } else {
                                    show_warn_pop(result.msg);
                                }
                            }, ‘json‘);
                        },
                        fail: function (res) {
                            alert(‘上传失败,请重新上传!‘);
                        }
                    })
                },100);
            },
            fail: function (res) {
                alert(‘上传失败,请重新上传!‘);
            }
        });
    }

PHP代码

         //控制器代码
        //引入JSSDK文件,Jssdk.class.php代码见下文。
        require_once(‘./model/Jssdk.class.php‘);

        $oJssdk = new JSSDK(微信APPID,  微信APPSERCERT);
         //这里获取jssdk配置
         $aWechatConfig = $oJssdk->getSignPackage();

        //这里可以引入模板文件

        
     //表单ajax提交验证代码
      //引入JSSDK
        require_once(‘./model/Jssdk.class.php‘);
        $oJssdk = new JSSDK(WX_MEMBER_FEE_APPID, WX_MEMBER_FEE_APPSERCERT);
        //access_token
        $sAccessToken = $oJssdk->getAccessToken();
        $sMediaId = filter_submit_string($mediaId);
        if ( ! $sMediaId) {
            return_error_json(‘参数错误,请重新选择图片上传!‘);
        }
        $sUrl = ‘https://api.weixin.qq.com/cgi-bin/media/get?access_token=‘ . $sAccessToken . ‘&media_id=‘ . $sMediaId;

        //文件名称
        $sImgPath = date(‘Y‘,time()).‘/‘.date(‘md‘,time()). ‘/‘.time(). ‘.jpg‘;
        $sImgName =  PHPCMS_ROOT.‘/front/public/uploadfile/‘ .$sImgPath;

        $oFileInfo = $oJssdk->downloadWechatFile($sUrl);
        if ($oFileInfo[‘body‘]) {
                $oJssdk->saveWechatFile($sImgName, $oFileInfo[‘body‘]);
                return_success_json($sImgPath);
        } else {
            return_error_json(‘上传失败,请重新选择!‘);
        }

jssdk.class.php

<?php
class JSSDK
{
    private $appId;
    private $appSecret;

    public function __construct($appId, $appSecret)
    {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    public function getSignPackage()
    {
        $jsapiTicket = $this->getJsApiTicket();

        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER[‘HTTPS‘]) && $_SERVER[‘HTTPS‘] !== ‘off‘ || $_SERVER[‘SERVER_PORT‘] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId" => $this->appId,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "url" => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    private function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket()
    {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode(file_get_contents("./jsapi_ticket.json"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $fp = fopen("jsapi_ticket.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }

        return $ticket;
    }

    public function getAccessToken()
    {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode(file_get_contents("./access_token.json"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $fp = fopen("access_token.json", "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }

    //https请求(支持GET和POST)
    public function httpGet($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }

    //下载文件
    public function downloadWechatFile($sUrl)
    {
        $resourceCh = curl_init($sUrl);
        curl_setopt($resourceCh, CURLOPT_HEADER, 0);
        curl_setopt($resourceCh, CURLOPT_NOBODY, 0); //只取body头
        curl_setopt($resourceCh, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($resourceCh, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($resourceCh, CURLOPT_RETURNTRANSFER, 1);
        $package = curl_exec($resourceCh);
        $httpinfo = curl_getinfo($resourceCh);
        curl_close($resourceCh);
        $imageAll = array_merge(array(‘header‘ => $httpinfo), array(‘body‘ => $package));
        return $imageAll;
    }

    //存储文件
    public function saveWechatFile($sFileName, $sFileContent)
    {
        $oLocalFile = fopen($sFileName, ‘w‘);
        if (false !== $oLocalFile) {
            if (false !== fwrite($oLocalFile, $sFileContent)) {
                fclose($oLocalFile);
            }
        }
    }
}

 来源:https://my.oschina.net/selly1025/blog/1550725?utm_medium=referral

微信JSSDK上传图片,代码为上传单张图

标签:ring   fail   ret   roo   red   本地   php   image   param   

原文地址:https://www.cnblogs.com/2019gdiceboy/p/12627964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!