微信开发--图片异步上传。

一、需求

微信网页中实现上传头像,用户信息,用户宣传照的功能。

二、问题

微信网页上传普通浏览器的上传不一样,微信内置浏览器禁止了普通的input上传功能,并且此标签在有些移动终端显示不佳。

三、解决

使用微信官方文档提供的jssdk的上传图片接口。微信自己的jssdk里面的图片上传不用考虑兼容性。

具体实现逻辑是:

配置好jssdk后,可以使用jssdk上传接口上传图片到微信服务器,微信服务器会返回给你一个资源id,我们在使用js异步或者表单同步把资源id传输到php服务器端,php服务器端就利用微信的多媒体下载文件接口再次请求微信服务器获得图片,然后保存到服务器上。

下面的一个异步上传,并可以上传后显示图片的实现代码:

wx.ready(function () {

// 5 图片接口

// 5.1 拍照、本地选图

var images = {

localId: [],

serverId: [],

};

document.querySelector(‘#chooseImage‘).onclick = function () {

//选择图片后开始异步上传到微信服务器,在syncUpload中接受微信服务器返回的资源id,组合后uploadserverid异步上传到服务器,服务器处理后返回图片的路径,客户端js接受图片路径后组合成html,动态插入。

wx.chooseImage({

success: function (res) {

images.localId = res.localIds;

len = images.localId.length;

syncUpload(images.localId);

}

});

};

//异步上传图片到微信服务器

var syncUpload = function(localIds){

var localId = localIds.shift();

wx.uploadImage({

localId: localId,

isShowProgressTips: 1,

success: function (res) {

images.serverId.push(res.serverId);// 返回图片的服务器端ID

if(len==images.serverId.length){

//异步上传图片id到服务器

var  serverids = images.serverId.join(‘,‘);

/*alert(serverids);*/

uploadserverid(serverids);

//销毁数据

images.localId = images.serverId  = [];

}

//其他对serverId做处理的代码

if(localIds.length > 0){

syncUpload(localIds);

}

},

error: function(){

alert("asasasas");

}

});

};

//异步上传图片id到服务器,服务器返回真正的图片地址,js组装后显示在页面上

var uploadserverid = function(serverId){

$.ajax({

url: "./index.php?m=Signup&a=upload",

type: "GET",

data: "serverid="+serverId,

success: function(msg){

if(msg==‘‘){

alert("上传失败,请重试");

}

//拼接html

htmlpin(msg);

},

error:function(){

alert("上传失败,请重试");

}

});

}

var htmlpin = function(msg){

//拼接图片html,显示在页面

var html = ‘‘;

for (var i =0; i<=msg.length - 1; i++) {

html += ‘<div class="col-xs-3 text-center"> <img class="img-responsive" src="./public/‘+ msg[i]+‘"> </div>‘;

};

$(‘.photo-b‘).html($(‘.photo-b‘).html() + html);

var values = $(‘#hiddenimages‘).val();

if(values!=‘‘){values+=‘,‘;}

$(‘#hiddenimages‘).val(values + msg.join(‘,‘));

/*  alert($(‘#hiddenimages‘).val());*/

}

}

服务器端:

根据微信文档描述,先获得access_token,然后根据token和资源id获得图片;注意:因为access_token每天的获取数量有限制,所以最好获取后保存到数据库中。并且access_token的长度是500多,所以要保证数据库字段的长度够用。

public function get_access_token(){

$tokenmodel = M(‘access_token‘);

$data = $tokenmodel->limit(1)->find();

/*if($data && $data[‘Expires_In‘]>time()){

return $data[‘Access_Token‘];

}*/

$url = ‘https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=‘.$this->AppID.‘&secret=‘.$this->AppSecret;

$html = file_get_contents($url);

$json = json_decode($html,true);

$tokenmodel->where(‘1‘)->delete();

$tokenmodel->add(array(‘Access_Token‘=>$json[‘access_token‘], ‘Expires_In‘=>intval($json[‘expires_in‘])+time()));

return $json[‘access_token‘];

}

//从微信服务器上获取媒体文件

public function get_media($access_token, $media_id){

$url = ‘https://api.weixin.qq.com/cgi-bin/media/get?access_token=‘.$access_token.‘&media_id=‘.$media_id;

$content = file_get_contents($url);

return $content;

}

//根据serverid从微信服务器获得图片并存储

public function upload(){

$serverid = I(‘get.serverid‘);

$serverids = explode(‘,‘, $serverid);

$wechatmodel = D(‘Wechat‘);

$flag = true;

foreach ($serverids as $key => $value) {

//  M(‘images‘)->add(array(‘Sid‘=>‘12‘, ‘ImagePath‘=>$value));

$content = $wechatmodel->get_media($wechatmodel->get_access_token(), $value);

$imgname = getRandChar(7).‘.jpg‘;

file_put_contents(realpath("./public/") . ‘/‘.$imgname, $content);

/* $open_id = cookie(‘xiu‘);*/

/* if($open_id==‘og0Q7s_Diefeni0_2vPfN_Tauc3Q‘){*/

if($flag){

$flag = false;

//引入图片处理库

import(‘ORG.Util.Image.ThinkImage‘);

//使用GD库来处理1.gif图片

$img = new ThinkImage(THINKIMAGE_GD, "./public/$imgname");

//原图宽

$oldwidth = $img->width();

$oldheight = $img->height();

if($oldwidth>$oldheight){

$new = $oldheight;

}else{

$new = $oldwidth;

}

//将图片裁剪为440x440并保存为corp.gif

$img->crop($new, $new)->save("./public/thumbs/$imgname");

}

/* }*/

$imgnames[] = $imgname;

}

$this->ajaxReturn($imgnames);

}

原文地址:http://www.daydaytc.com/php/847.html

时间: 2024-08-28 03:10:19

微信开发--图片异步上传。的相关文章

C#中使用iframe结合js实现图片异步上传

将图片上传的页面放在iframe中,通过iframe跳转到另一个页面,在该页中将图片提交到服务器,而不需要对主页进行刷新,提交成功后用脚本(回调函数)实现上传的图片在主页面的显示. 图片选择页面 Add.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add.aspx.cs" Inherits="_Add" %> <!DOCTYPE h

html5图片异步上传/ 表单提交相关

1 form 表单 get/post提交时候. action地址(或者啥ajax的url地址) 会涉及到跨域问题 常见跨域问题http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html 举例: 第一种写法 相对路径 $.get('localhost:8080/test_upload/aservlet', { }, function (data) { }); test_upload 为项目名 这里写的为相对路径,不会出现问题 第二种

asp.net使用jquery.form实现图片异步上传

首先我们需要做准备工作: jquery下载:http://files.cnblogs.com/tianguook/jquery1.8.rar jquery.form.js下载:http://files.cnblogs.com/tianguook/jquery.form.js 页面JqueryFormTest.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="JqueryForm

html+servlet实现多图片异步上传

html页面 <!doctype html> <html> <head> <meta charset="utf-8"> <title>点击上传</title> <script src="js/jquery-1.11.1.js"></script> <script src="js/ajaxfileupload.js"></script&

ajax图片上传,图片异步上传,更新

继承前文:图片上传_ajax上传之实际应用(附上Demo) 直接上源码吧: js源码: /// <reference path="jquery-1.8.3.js" /> /// <reference path="ajaxForm/jquery.form.js" /> /*! * jQuery upload * 用于上传单个文件,上传成功后,返回文件路径. * 本插件依赖jQuery,jquery.form 请在使用时引入依赖的文件 * * D

Android -- 图片异步上传到PHP服务器

背景                                                                                           网上很多上传到java服务器上的,找了好久,找到了上传到php的了,思路跟我当初想的差不多,就是POST过去.废话不多说,直接上图看代码. php代码                                                                                  

html5 XMLHttpRequest 图片异步上传

<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <tilte>uploadFile</title> <script> function uploadFile(){ var formData = new FormData(); var files = document.getElementById('file').files; var file

jquery 和 FormData 最简单图片异步上传

<script src="/scripts/jquery/jquery-3.1.1.min.js"></script> <script type="text/javascript"> $(function () { var fileInfo = $('#file').prop('files')[0]; var fm = new FormData(); fd.append("xxxx", fileInfo); $

PHP JS JQ 异步上传并立即显示图片

http://my.oschina.net/zerodeng/blog/313773 提交页面: <! DOCTYPE html> < html> < head> < meta charset ="GB2312" > < title> Insert title here </title > < script type ="text/javascript" src= "jquery