7
回答
php 5.5.7 以上 微信卡券上传logo问题
终于搞明白,存储TCO原来是这样算的>>>   
$img = file_get_contents(trim($this->_G['g_img']));
$data['buffer'] = $img;
$url = 'https://api.weixin.qq.com/card/create?access_token='.$accesstoken;
                    $curl = curl_init();
                    curl_setopt ($curl, CURLOPT_URL, $url);
                    curl_setopt($curl, CURLOPT_POST, 1);
                    curl_setopt($curl, CURLOPT_NOBODY, 0);
                    curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($curl,CURLOPT_POST,1);
                    curl_setopt ($curl, CURLOPT_POSTFIELDS, $data);
                    curl_setopt ($curl, CURLOPT_TIMEOUT,$timeout);
                    $r = curl_exec($curl);
                    curl_close ($curl);

或者直接 $data['buffer'] = new CURLFile(‘test.png');

我的php 已经不支持 @文件了

微信一直提示 {"errcode":47001,"errmsg":"data format error hint: [Acm1cA0439ent3] data is not utf8"}

想请问有什么方法可以上传上去吗??  或者怎样把文件流转码??   正常情况我程序是utf8的  不清楚怎样查看/转换文件流的编码 还希望得到大家的帮助~~!


http请求方式: POST/FROMhttps://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

参数 是否必须 说明
buffer 文件的数据流
access_token 调用接口凭证

调用示例(使用curl命令,用FORM表单方式上传一个图片):curl –Fbuffer=@test.jpg

返回状态码的说明
47001 解析JSON/XML内容错误

这是微信的手册



用了这样的一个方法结果无效
    private function getSafeStr($str){
    $s1 = iconv('utf-8','gbk',$str);
    $s0 = iconv('gbk','utf-8',$s1);
    if($s0 == $str){
        return $s1;
    }else{
        return $str;
    }
    }

直 接前台提交表单  head指定 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   也试过了   依旧提示 {"errcode":47001,"errmsg":"data format error hint: [Acm1cA0439ent3] data is not utf8"}

--------------------------

尝试了一下  $img = 'data:image/jpg;base64,'.base64_encode($img);  图片是好用的 chrome能正常显示

微信返回{"errcode":47001,"errmsg":"data format error hint: [R00iDa0334ent2] Error before ------------------------------2a0e34532e52\r\nContent-Disposition: form-data; name=\"buffer\"\r\n\r\ndata:image\/jpg;base64,..."}

举报
共有7个答案 最后回答: 2年前
(以前)微信对UTF8支持有问题,不能有\xxxx格式的。看是不是文件名有中文。可以尝试把相关字符串用addslash()处理下。如果是提交json字符串那么在调用json_encode()时带上 参数         $str = json_encode($arg, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);


--- 共有 1 条评论 ---
很懒的家伙$img = file_get_contents(trim($this->_G['g_img'])); $data['buffer'] = addslashes($img); 微信服务器返回的 jpg返回false png返回501 2年前 回复
$img = file_get_contents(trim($this->_G['g_img']));

$data['buffer'] = addslashes($img);

微信服务器返回的

jpg返回false

png返回501



尝试了一下  $img = 'data:image/jpg;base64,'.base64_encode($img);  图片是好用的 chrome能正常显示

微信返回{"errcode":47001,"errmsg":"data format error hint: [R00iDa0334ent2] Error before ------------------------------2a0e34532e52\r\nContent-Disposition: form-data; name=\"buffer\"\r\n\r\ndata:image\/jpg;base64,..."}

引用来自“很懒的家伙”的评论

尝试了一下  $img = 'data:image/jpg;base64,'.base64_encode($img);  图片是好用的 chrome能正常显示

微信返回{"errcode":47001,"errmsg":"data format error hint: [R00iDa0334ent2] Error before ------------------------------2a0e34532e52\r\nContent-Disposition: form-data; name=\"buffer\"\r\n\r\ndata:image\/jpg;base64,..."}

老版本的微信读取图片输出 dataURL有问题,合法的是 'data:image/jpg;base64,....',微信读取出来的是  'data:;base64,', 缺少mime格式,需要你自己加上。

下面是js的函数:


var mime = {'png': 'image/png', 'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'bmp': 'image/bmp'};



/*
 * fix微信webview读取图片toDataURL缺少文件类型
 * @param string file name
 * @param string dataURL
 */
var fixMIME = function(filename, dataurl) {
	if (dataurl && typeof window.WeixinJSBridge == 'object') {
		var types = config.allowedExtension.split('|'),
			len = types.length,
			flag = false;
		if ( ! len) {
			return false;
		}
		if (dataurl.slice(0, 20).indexOf('data:base64') != -1) {
			var ext = filename.split('.');
			if ( ! ext || ext.length <= 1) {
				return false;
			}
			else {
				ext = ext[ext.length - 1];
				ext && (dataurl = dataurl.replace('data:base64,', 'data:' + mime[ext] + ';base64,'));
			}
		}
	}
	return dataurl;
};





引用来自“mark35”的评论

引用来自“很懒的家伙”的评论

尝试了一下  $img = 'data:image/jpg;base64,'.base64_encode($img);  图片是好用的 chrome能正常显示

微信返回{"errcode":47001,"errmsg":"data format error hint: [R00iDa0334ent2] Error before ------------------------------2a0e34532e52\r\nContent-Disposition: form-data; name=\"buffer\"\r\n\r\ndata:image\/jpg;base64,..."}

老版本的微信读取图片输出 dataURL有问题,合法的是 'data:image/jpg;base64,....',微信读取出来的是  'data:;base64,', 缺少mime格式,需要你自己加上。

下面是js的函数:


var mime = {'png': 'image/png', 'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'bmp': 'image/bmp'};



/*
 * fix微信webview读取图片toDataURL缺少文件类型
 * @param string file name
 * @param string dataURL
 */
var fixMIME = function(filename, dataurl) {
	if (dataurl && typeof window.WeixinJSBridge == 'object') {
		var types = config.allowedExtension.split('|'),
			len = types.length,
			flag = false;
		if ( ! len) {
			return false;
		}
		if (dataurl.slice(0, 20).indexOf('data:base64') != -1) {
			var ext = filename.split('.');
			if ( ! ext || ext.length <= 1) {
				return false;
			}
			else {
				ext = ext[ext.length - 1];
				ext && (dataurl = dataurl.replace('data:base64,', 'data:' + mime[ext] + ';base64,'));
			}
		}
	}
	return dataurl;
};





由于现在都是测试阶段 暂时就写死的图片 有加上类型  其实用base64也只是一种侥幸心理  微信手册上说 的 buffer 是文件流  就是不太清楚文件流具体怎么控制格式  我正常传 微信提示我{"errcode":47001,"errmsg":"data format error hint: [zWzfDA0550ent1] data is not utf8"}    其实对于47001  微信给的解释是 解析JSON/XML内容错误   我不是很确定一定是编码问题
--- 共有 1 条评论 ---
很懒的家伙就用的一个测试图片 所以 base64 类型也都是直接写死的 2年前 回复
顶部