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

这篇具有很好参考价值的文章主要介绍了【详解微信小程序 wx.uploadFile 的编码坑】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

wx.uploadFile({

url: ‘https:///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);

},

})

},

服务端我用的 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”);

http:// 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’;

}

在小程序开发工具中运行小程序,选择好图片后进行上传操作,服务器端成功接收到数据,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

( ps:php 中,FILES 里有 tmp_name 为收到了文件,将临时文件从该路径中移动到指定目录便可保存文件,这里看到有 /tmp/phpe3zGok 临时文件,说明成功收到了文件) 将小程序预览到手机上,点击eiNTFjnkD上传,但却出现了问题,如下所示:

POST 数据为空, FILES 成功收到,而单独输出的$_POST数据出现乱码(中文和泰文部分),出现了溢出.

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

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

header{“chartset”:”utf-8”}

//或者

header{“content-type”:‘application/x-www-form-urlencoded’}

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

知道 header 是个bug , 那么编码的操作暂时只能手动进行了,于是我将小程序段的数据都进行编码. 在 javascript 中,字符串编码函数是 encodeURI, 在小程序中尝试,也有该函数,所以我将小程序代码改为如下

wx.uhttp://ploadFile({

url: ‘https:///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);

},

})

},

服务器端, 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’;

}

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

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

可以看到,所有数据都正常输出,其中POST 数据中 city 和 name未解码前是 urlencode 编码形式的数据,解码后正常输出.

至此,我想使用小程序上传带文件信息到服务器端算是调通了, 希望这个方法能对出现同样问题的同学有一定帮助。文章来源地址https://www.toymoban.com/news/detail-753833.html

到了这里,关于【详解微信小程序 wx.uploadFile 的编码坑】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序-支付(wx.requestPayment)

    (学习中,持续更新) 直接调用的接口为wx.requestPayment(小程序前端调用)。 官方文档的请求例子为: 其中paySign官方文档给出了一个例子: MD5(appId=wxd678efh567hg6787nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VSpackage=prepay_id=wx2017033010242291fcfe0db70013231072signType=MD5timeStamp=1490840662key=qazwsxedcrfvtg

    2024年02月12日
    浏览(37)
  • 微信小程序-登录(wx.login)

    用户微信登录小程序有两种情况,分别为弹出登录提示和不弹出登录提示两种。弹出登录提示的情况下,用户确定后会向后台传入更多参数,例如用户昵称等。不弹出登录提示只能获取到用户的临时登录凭证code。主要根据第二种情况进行描述。 这个code具有时效性,能用于区

    2024年02月15日
    浏览(49)
  • 微信小程序 wx:if使用

    在微信小程序中,可以使用 wx:if 指令来控制某个元素是否需要被渲染到页面上。根据条件表达式的结果, wx:if 指令决定元素是否显示。 下面是使用 wx:if 的基本示例: 在上述代码中, wx:if 指令的值为一个条件表达式 {{condition}} ,根据该条件表达式的结果决定是否渲染 view 元

    2024年02月09日
    浏览(49)
  • 微信小程序本地存储(wx.setStorage)和(wx.setStorageSync)

     在微信小程序中,可以使用本地存储来保存一些数据比如用户状态,姓名,性别等; 本地存储主要包括两种方式:缓存和本地数据存储。 缓存 缓存是一种快速访问内存的临时存储机制,可以有效地提高应用程序的响应速度。在微信小程序中,可以使用 wx.setStorage 方法和

    2023年04月18日
    浏览(94)
  • 微信小程序如何实现兼容----wx.getSystemInfoSync、 wx.getSystemInfo、wx.canIUse

    小程序的宿主环境一直在迭代更新,提供更多的能力给开发者去完成更多的事情,所以你的小程序会运行在不同版本的宿主环境下。为了让你的小程序在不同环境下都能提供相应的服务,我们需要来了解一下在小程序中如何实现兼容办法。 1.针对不同手机进行程序上的兼容

    2024年02月09日
    浏览(49)
  • 微信小程序wx:for 的使用以及wx:key绑定

    wx:for基本使用 wx:for-item和wx:for-index重新命名item和index wx:key两种绑定方式以及注意事项 wx:for基本使用 业务层数据 视图层 wx:for遍历时候每一项名称为 item 每一项索引名称为 index wx:for-item和wx:for-index实现item和index重命名 wx:for-item=\\\"str\\\" 将原来名称 item 修改成 str wx:for-index=\\\"i 将原来

    2024年02月11日
    浏览(77)
  • 微信小程序封装wx.request请求

    对微信小程序的印象我还停留在2年前刚入行的时候,那是还不懂什么是Promise,只知道小程序发请求有时候要在success回调中嵌套好多层(后来我才知道这叫 回调地狱 )。最近刚好有个小程序的项目交给我发开发,加上如今的我自认为对Promise掌握的还可以,所以这次也尝试着封

    2024年02月16日
    浏览(45)
  • 微信小程序wx.getUserProfile的用法

    接触了以前开发的一个微信小程序,发现wx.getUserInfo这个官方接口不能获取用户的信息,我重新创建了一个新的项目,发现可以用wx.getUserProfile这个官方接口来获取用户信息,具体操作如下:1.首先在xxxx.jslim里面定义初始值,isAuthorization是为了解决每次登陆都需要获取用户信息

    2024年02月14日
    浏览(38)
  • 微信小程序wx.setClipboardData复制文本

    今天在开发中遇到一个问题,在小程序中 复制文本,在做之前也查了资料,大部分都是固定文本复制,(小程序本身是不能手动复制的)和需求还是不一样的。 对于复制官方文档中提供了: wx.setClipboardData 设置系统剪贴板的内容。调用成功后,会弹出 toast 提示\\\"内容已复制

    2024年02月09日
    浏览(42)
  • 【微信小程序】列表渲染wx:for

    🏆今日学习目标:第十二期——列表渲染wx:for 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:20分钟 🎉专栏系列:我的第一个微信小程序 哈喽大家好,本期是微信小程序专栏第十二期,本期我们将学习列表渲染wx:for。 注意:每期内容是连载呢,建议大家

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包