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

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

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

时间: 2024-10-06 22:39:41

微信JSSDK上传图片,代码为上传单张图的相关文章

【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(二 、上传图片服务器操作)

上一篇文章,已经介绍过关于微信上传图片的前端JS-SDK , 如果有没看到第一篇的朋友, 可以先看看第一篇 http://www.cnblogs.com/29boke/p/5483599.html 好了,现在继续向大家介绍,我们.NET 是如何实现图片上传到自己的服务器的. 上次提到, function upload() {             wx.uploadImage({                 localId: images.localId[i],              

微信朋友圈的图片上传,多图上传怎么去撸才合适?我们一起来实现吧!

微信朋友圈的图片上传,多图上传怎么去撸才合适?我们一起来实现吧! 图片上传是非常常见的功能,而多图上传在大多数应用中也是非常常见的,比如微信的朋友圈,微博的动态,都是有九宫格图片的,那这里肯定涉及了多图上传,所以今天我们来一起撸一下,怎么去思考这个实现逻辑! 这里我想到的思路是比较简单的,首先,我们有一个按钮,按钮是上传图片,点击之后弹出某个界面进行图片的选择,一般是九张图片或者十二张,选完之后就直接上传了,大致的流程应该是这个样子,那我们首先来写个按钮 activity_main.xml <?

微信小程序多张图片上传

微信小程序上传图片每次只能上传一张,所有很多朋友就会问想要多张图片上传怎么办? 首先,我们来看一看wx.chooseImage(object)和wx.uploadFile(OBJECT)这两个个api 示例代码是这样的: wx.chooseImage({ success: function(res) { var tempFilePaths = res.tempFilePaths wx.uploadFile({ url: 'http://example.weixin.qq.com/upload',

转:微信公众平台开发(80) 上传下载多媒体文件

微信公众平台开发(80) 上传下载多媒体文件 微信公众账号在回复图片.语音.视频的时候,将使用media_id来调用相关文件,很多朋友咨询这个如何开发实现.本文将介绍在微信公众平台开发过程中,如何上传下载多媒体文件. 一.上传多媒体文件 公众号可调用本接口来上传图片.语音.视频等文件到微信服务器,上传后服务器会返回对应的media_id,公众号此后可根据该media_id来获取多媒体.请注意,media_id是可复用的,调用该接口需http协议. 通常,文件上传是通过html表单进行的,但通过C

微信应用号小程序上传wx.uploadFile(OBJECT)

微信应用号小程序上传wx.uploadFile(OBJECT) wx.uploadFile(OBJECT) ? 将本地资源上传到开发者服务器.如页面通过 wx.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器.客户端发起一个HTTPS POST请求,其中 Content-Type 为 multipart/form-data . OBJECT参数说明: 参数 类型 必填 说明 url String 是 开发者服务器url filePath S

【轻松一刻】项目代码已上传至开源中国[email&#160;protected]

项目代码已上传至开源中国[email protected],实际上16号左右就改的差不多了,一直耽搁没上传.其中程序中关于趣图的部分我并没有写.其他部分基本完整.主要原因是聚合数据返回的趣图大小不一,且图片尺寸偏小,在1080p和720p的手机上效果都很不好.暂时就不加了.您可以自行找合适的图片接口或者网上爬取合适尺寸的图片,其中图片list的展示与笑话的list展示类似. 后续这个小项目可能也不再更新了. 需要说明的是聚合数据接口的使用是有时间限制的,要想一直使用接口,需要应用上线,并且官网实

香蕉派 banana pi BPI-M2_WiringPI 测试成功 代码已经上传GITHUB

香蕉派 banana pi BPI-M2_WiringPI 测试成功,代码已经上传到GITHUB BPI wiringpi 由树莓派最新的WiringPi代码修改过来,完全与树莓派的使用方法一样. GPIO库与测试代码完全公开在GITHUB上:https://github.com/BPI-SINOVOIP/BPI-WiringPi/tree/BPI_M2 演示视频: http://v.youku.com/v_show/id_XMTMxMjA1NTY3Mg==.html?from=y1.7-1.2

帝国CMS7.2新增多图同时上传插件,上传多图效率更高

原来上传多图文件,需要挨个选择文件,然后再点批量上传,比较麻烦.所以帝国CMS7.2新增了多图上传插件:为采用FLASH方式实现同时选择多个图片一起上传,提高多图上传效率. 帝国CMS多图上传插件特性如下: 1.采用FLASH方式实现同时选择多个图片一起上传. 2.多图插件安装后,在以下3个地方可以使用: (1).信息上传图片时; (2).图集字段morepic上传图片时; (3).编辑器多图片上传时. 3.上传图片后显示格式采用单独模板文件,用户可自行修改返回格式模板文件,很个性化. 4.本插

微信JSSDK上传多图预览,点击查看大图

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> <meta name="ap