微信小程序 wx.uploadFile 的编码坑

微信小程序wx.upload上传图片后台java 前台代码: bindPhoto(e) { var that = this; wx.chooseImage({ count: 1, sizeType: ['original','compressed'], // 指定原图或者压缩图 sourceType: ['album', 'camera'], // 指定图片来源 success: function (res) 阅读详情

From:http://blog.youkuaiyun.com/futurewu/article/details/53436222

转载一篇关于小程序往服务器上传图片和文本信息的博文吧,个人感觉很有帮助!因为之前我自己不知道在小程序中怎么把图片和文本信息同时上传到服务器,看了这篇博文后,才知道文本信息是需要添加到 formData:中进行传递。

编写微信小程序时,用到 wx.uploadFile,用来上传图片+文本信息.然而在编写过程中,由于官方的 demo 和文档描述很少,在几个坑上耗费了不少时间.

这里分享一个和编码有关的坑,主要是由于真机预览时 formData 中的非字母、数字的 ASCII 编码的字符如中文、泰文传输到服务端将不会自动进行转码码,并会会产生乱码及溢出,从而导致错误。

微信的 uploadFile 类似与 html 中的form带文件上传的表单 ( enctype=”multipart/form-data” ), 这样 post 上传的表单,可以包含文件,同时包含其它的键值数据。微信小程序用 uploadFile 实现类似的操作. 我的微信小程序端的uploadFile 代码如下 :

   wx.uploadFile({
            url: 'https://<upload_domain>/save',
            filePath:photoPath, //待上传的图片,由 chooseImage获得
            name:'food_image',
            formData: {
              latitude:0.0,
              longitude:0.0,
              restaurant_id:0,
              city:'北京',
              name:'beijing' // 名称
            }, // HTTP 请求中其他额外的 form data
            success: function(res){
              console.log("addfood success",res);
            },
            fail: function(res) {
              console.log("addfood fail",res);
            },
          })
},
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

服务端我用的 php 编写,这里接受文件的接口为 save ,我将  POST和 _FILES 里的数据直接输出到info.log 文件中用来进行调试.代码如下:

public function save(Request $request)
{
    error_log("FILES:" . json_encode($_FILES) . "\r\n", 3, "./logs/info.log");
    error_log("POST: " . json_encode($_POST) . "\r\n", 3, "./logs/info.log");
    error_log("city: " . $_POST["city"] . "\r\n", 3, "./logs/info.log");
    error_log("name: " . $_POST["name"] . "\r\n", 3, "./logs/info.log");
    error_log("latitude: " . $_POST["latitude"] . "\r\n", 3, "./logs/info.log");
    error_log("longitude: " . $_POST["longitude"] . "\r\n", 3, "./logs/info.log");
    error_log("restaurant_id: " . $_POST["restaurant_id"] . "\r\n", 3, "./logs/info.log");
    error_log("tags: " . $_POST["city"] . "\r\n", 3, "./logs/info.log");
  echo 'success';
} 
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在小程序开发工具中运行小程序,选择好图片后进行上传操作,服务器端成功接收到数据,info.log输出的数据信息如下:

FILES:{"food_image":{"name":"store_265332457o6zAJszC4WsrwhUy55eh7iKJt7EQ1480318543139.jpg","type":"image\/jpeg","tmp_name":"\/tmp\/phpe3zGok","error":0,"size":845941}}
POST: {"latitude":"0","longitude":"0","restaurant_id":"0","tags":"","city":"\u5317\u4eac","name":"\u0e1b\u0e31\u0e01\u0e01\u0e34\u0e48\u0e07"}
city: 北京
name: ปักกิ่ง
latitude: 0
longitude: 0
restaurant_id: 0
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

( ps:php 中,FILES 里有 tmp_name 为收到了文件,将临时文件从该路径中移动到指定目录便可保存文件,这里看到有 /tmp/phpe3zGok 临时文件,说明成功收到了文件) 将小程序预览到手机上,点击上传,但却出现了问题,如下所示: 
这里写图片描述 
POST 数据为空, FILES 成功收到,而单独输出的$_POST数据出现乱码(中文和泰文部分),出现了溢出.

可以看到,非英文,数字的数据是乱码,而其它数据没有问题,显然是编码出现了问题,POST 数据输出为空,由于乱码导致了溢出使得格式错乱.

编码有问题,那么就尝试改变它的编码进行传输, uploadFile 的参数中加入

header{“chartset”:”utf-8”}
//或者 
header{"content-type":'application/x-www-form-urlencoded'}
   
  • 1
  • 2
  • 3

但是都没有什么效果,依然是在微信小程序工具中有效,而手机真机预览的时候出现乱码.在看到这篇帖子 【新手跳坑指南《三十九》wx.uploadFile】 才知道header 里的数据在真机预览的时候是无效的,需要改到 formData 中,受到了启发,尝试将编码数据加入formData 中,但仅仅传输了数据,并没有改变编码.依然是小程序开发工具中调试成功,而真机预览出了问题,这个估计要微信团队来回答了。 
知道 header 是个bug , 那么编码的操作暂时只能手动进行了,于是我将小程序段的数据都进行编码. 在 javascript 中,字符串编码函数是 encodeURI, 在小程序中尝试,也有该函数,所以我将小程序代码改为如下

wx.uploadFile({
            url: 'https://<upload_domain>/save',
            filePath:photoPath, //待上传的图片,由 chooseImage获得
            name:'food_image',
            formData: {
              latitude:encodeURI(0.0),
              longitude:encodeURI(0.0),
              restaurant_id:encodeURI(0),
              city:encodeURI('北京'),
              name:encodeURI('beijing') // 名称
            }, // HTTP 请求中其他额外的 form data
            success: function(res){
              console.log("addfood success",res);
            },
            fail: function(res) {
              console.log("addfood fail",res);
            },
          })
},
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

服务器端, php 进行 url 解码的函数是 urldecode

public function save(Request $request)
{
    error_log("FILES:" . json_encode($_FILES) . "\r\n", 3, "./logs/info.log");
    error_log("POST: " . json_encode($_POST) . "\r\n", 3, "./logs/info.log");
    error_log("city: " . urldecode($_POST["city"]) . "\r\n", 3, "./logs/info.log");
    error_log("name: " . urldecode($_POST["name"]) . "\r\n", 3, "./logs/info.log");
    error_log("latitude: " . urldecode($_POST["latitude"]) . "\r\n", 3, "./logs/info.log");
    error_log("longitude: " . urldecode($_POST["longitude"]) . "\r\n", 3, "./logs/info.log");
    error_log("restaurant_id: " . urldecode($_POST["restaurant_id"]) . "\r\n", 3, "./logs/info.log");
    error_log("tags: " . urldecode($_POST["city"]) . "\r\n", 3, "./logs/info.log");
    echo 'success';
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

再次测试,真机预览测试输出如下:

ILES:{"food_image":{"name":"jpeg","type":"image\/jpeg","tmp_name":"\/tmp\/php1svqDs","error":0,"size":9561}}
POST: {"restaurant_id":"0","tags":"","longitude":"0","latitude":"0","city":"%E5%8C%97%E4%BA%AC","name":"%E0%B8%9B%E0%B8%B1%E0%B8%81%E0%B8%81%E0%B8%B4%E0%B9%88%E0%B8%87"}
city: 北京
name: ปักกิ่ง
latitude: 0
longitude: 0
restaurant_id: 0
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看到,所有数据都正常输出,其中POST 数据中 city 和 name未解码前是 urlencode 编码形式的数据,解码后正常输出. 
至此,我想使用小程序上传带文件信息到服务器端算是调通了, 希望这个方法能对出现同样问题的同学有一定帮助。

原文链接:微信小程序 wx.uploadFile 的编码坑 www.agent007.pw


微信小程序之人脸识别(1) 首先需要在js代码中访问上传文件的wx.uploadFile()接口,将本地资源上传到开发者服务器,客户端发起一个 HTTPS POST 请求,其中content-ytype为multipart/form-data。返回一个 uploadTask 对象,通过 uploadTask,可监听上传进度变化事件,以及取消上传任务。下面是我的js代码:将访问接口的代码写入一个方法中,方便调用。functio... 阅读详情

相关推荐

小程序wx.uploadFile出现中文无法上传或者出现乱码

各位同学小程序中碰到上传图片或者文件时有用到formData的  formData Object 否 HTTP 请求中其他额外的 form data  出现中文无法上传或者出现乱码时可以参考一下这篇跳坑指南微信小程序联盟-uploadFile跳坑指南  里面讲的很详细了,这里归纳一下,解决方法:  在formData中对文字进行编码,使用encodeURI()  wxml中例:   formData: { name:encodeURI(name), address:encodeURI(address), }, // HTTP 请求中其他额外的 form data 上网搜了很多:  UrlEnc

【详解微信小程序 wx.uploadFile 的编码坑】

但是都没有什么效果,依然是在微信小程序工具中有效,而手机真机预览的时候出现乱码.在看到这篇帖子 【新手跳坑指南《三十九》wx.uploadFile】 才知道header 里的数据在真机预览的时候是无效的,需要改到 formData 中,受到了启发,尝试将编码数据加入formData 中,但仅仅传输了数据,并没有改变编码.依然是小程序开发工具中调试成功,而真机预览出了问题,这个估计要微信团队来回答了。编码有问题,那么就尝试改变它的编码进行传输, uploadFile 的参数中加入。

jerly1943的博客 3538

微信小程序 wx.uploadFile无法上传解决办法

主要介绍了微信小程序 wx.uploadFile无法上传解决办法的相关资料,需要的朋友可以参考下

记 微信小程序开发中遇到的坑之 wx.uploadFile 的?¤§??????????????? 编码问题(功夫不负有心人)

最近弄微信小程序,在上传图片的时候 遇到了一个编码问题后台拿到的json里中文都变成了 ? ¤§??????????????? 于是乎使出百般解数诸如此类 又或者修改Tomcat配置加上URIEncoding="UTF-8" 等等都没有用 还是感谢这位博主大大https://blog.csdn.net/futurewu/article/details/53436222强势分析一...

b_e_w的博客 728

详解微信小程序 wx.uploadFile 的编码坑

编写微信小程序时,用到 wx.uploadFile,用来上传图片+文本信息,本篇文章主要介绍了微信小程序 wx.uploadFile 的编码坑,有兴趣的可以了解一下。

拥有AI助手便能解放双手?——抖音直播脚本的生成

科技改变生活,AI助手帮你完成抖音创作!

Scientist_的博客 2353

Face Analysis WebUI实操手册:结果图Base64编码嵌入HTML邮件、微信小程序直传方案

本文介绍了如何在星图GPU平台上自动化部署人脸分析系统 (Face Analysis WebUI) 镜像,快速构建开箱即用的人脸智能分析服务。用户上传照片即可获得带标注的结果图(含年龄、性别、姿态及关键点),并支持将结果图Base64编码后嵌入HTML邮件或直传微信小程序,显著提升HR简报、安防筛查等业务场景的交付效率。

weixin_30356433的博客 97

【Python爬虫】爬取企业专利信息

本来是个美好的周末的,但是周五晚上领导给了一个公司名称的Excel,让把这些公司的专利信息爬取下来。本文记录了爬取企业专利信息的心酸过程。码字不易,喜欢请点赞!!! 一、找寻目标网页 在接到这个任务之后,我的内心是拒绝的。但是又不能不干。因此首先我需要先找到有公司专利信息的地方。在一番查找和问了问朋友之后,我知道中国专利网、国家知识产权网、Incopat、天眼查、企查查这些网站上面都有企业的专利...

Asher117的博客 2万+

wx.uploadFile php接受,微信小程序wx.uploadfile 本地文件转base64的实现代码

这篇文章主要介绍了微信小程序wx.uploadfile 本地文件转base64的实现方法,文中通过代码讲解给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下微信小程序wx.uploadfile, 利用PHP接口把本地图片转化为base64位。网上到处都是粘贴复制的wx.uploadfile的解决方案, 但目前还没有具体的代码:特意呈现出来给需要的伙伴们:代码:case 'imgBu...

weixin_39844481的博客 484

使用Matlab进行IEEE 33节点潮流计算的NR法实现详解及应用实例

IEEE 33节点系统是一个标准的配电系统模型,广泛用于学术研究和工程应用。该系统由33个节点和37条线路组成,结构复杂,具有代表性。其潮流计算结果可用于验证各种潮流计算方法的准确性和效率。NR法是一种基于迭代求解的潮流计算方法,通过不断迭代求解非线性方程组,直到达到预定的收敛条件。NR法具有收敛速度快、计算精度高的优点,适用于大规模复杂电力系统的潮流计算。

m0_57781768的博客 2071

机器人多学科仿真软件:Webots_(19).Webots的插件与扩展开发

通过上述步骤,您可以开发和使用Webots的插件、扩展和接口,以增强其功能和灵活性。

kkchenjj的博客 926

小程序uploadfile的php代码,微信小程序wx.uploadfile 本地文件转base64的实现代码

微信小程序wx.uploadfile,利用PHP接口把本地图片转化为base64位。网上到处都是粘贴复制的wx.uploadfile的解决方案,但目前还没有具体的代码:特意呈现出来给需要的伙伴们:$data='';file_put_contents("1.txt",var_export($_FILES,true)."\r\n",FILE_APPEND);if(!empty($_FILES['upl...

weixin_39686634的博客 435

吃透工业通信:C#工控机实现Modbus、OPC UA、Profinet、EtherCAT协议全适配

本文介绍了基于C#的工业通信协议全适配方案,采用分层架构设计实现Modbus、OPC UA、Profinet和EtherCAT四种主流协议的统一管理。核心包括:1)三层架构(应用层、抽象层、协议层)降低耦合;2)定义统一通信接口IIndustrialCommunication;3)工厂模式创建不同协议实例;4)以Modbus TCP为例展示具体实现。该方案经过实际项目验证,可简化多协议设备管理,提升工业自动化系统的开发效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 725

微信小程序wx.uploadfile 本地文件转base64

微信小程序wx.uploadfile, 利用接口把本地图片转化为base64流. 网上到处都是粘贴复制的wx.uploadfile的解决方案, 但目前还没有具体的代码: 特意呈现出来给需要的伙伴们:

Websites 14万+

【Unity】 预制体Prefab使用说明

在 Unity 中,Prefab 是一个可以预先制作并重复使用的 GameObject 或组件集合,Prefab 中的 GameObject 可以有子对象和其他组件。

灵境引路人 2852

YOLOv13改进策略【特征提取层】| CVPR-2024 PKI Module 获取多尺度纹理特征,适应尺度变化大的目标

PKI Module是。

Limiiiing的博客 276

微信小程序上传图片

var that = this; wx.chooseImage({ count: 1, //最多可以选择的图片总数 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { // 返...

weixin_30872671的博客 95

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

微信小程序wx.uploadFile常见失败原因与解决方案

开始计时的,文件没传完就超时断开,服务端 access log 只有收到完整请求才会打印。“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”协议和非备案域名直接被拦截,连 TCP 握手都不发。开发版**生效,真机调试(扫码)和体验版不走这个开关。这说明请求到了,服务端也处理完了,但前端等不及先断了。如果之前在设置页手动填过 baseURL,它会被。的,无法看出时间分布。原因:微信对网络请求有合法域名校验。回调触发,但 errMsg 含。,因为 TCP 连接没建立起来。

2301_76804515的博客 382

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: Java输出当前的日期(年月日时分秒毫秒)
下一篇: 微信小程序服务器端获取图像和文本信息
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值