微信小程序开发(二)图片上传+服务端接收详解


Posted in Javascript onJanuary 11, 2017

这次介绍下小程序当中常用的图片上传。

前几天做了图片上传功能,被坑了一下。接下来我们来看一下微信的上传api。

微信小程序开发(二)图片上传+服务端接收详解

这里的filePath就是图片的存储路径,类型居然是个String,也就是 只能每次传一张图片,我以前的接口都是接收一个array,我本人又是一个半吊子的PHP,只能自己去改接收图片的接口。

看一下页面效果图

微信小程序开发(二)图片上传+服务端接收详解

一个很常见的修改头像效果,选择图片(拍照),然后上传。

下面就是贴代码了

首先是小程序的wxml代码

<view class="xd-container">
<form bindsubmit="bindSaveTap">
<image class="xd-img-user1" catchtap="chooseImageTap" src="{{logo}}"></image>
<view class="xd-view-section">
 <text class="xd-abs xd-flex-left xd-text-nick">昵称</text>
 <input name="nick_name" placeholder="请输入昵称" class="xd-input" value="{{userInfo.user_name}}"/>
</view>
<view class="xd-view-section1">
 <text class="xd-abs xd-flex-left xd-text-nick">宝宝性别</text>
 <radio-group class="xd-abs xd-radio-group" name="baby_sex">
 <label class="xd-label-radio" wx:for="{{sex_items}}" wx:key="item">
 <radio color="#3cc975" value="{{item.name}}" wx:if="{{item.name==userInfo.baby_sex}}" checked="true"/>
 <radio color="#3cc975" value="{{item.name}}" wx:else checked="false"/>
 <text class="xd-radio-text">{{item.value}}</text>
 </label>
 </radio-group>
</view>
<view class="xd-view-section1">
 <text class="xd-abs xd-flex-left xd-text-nick">宝宝年龄</text>
 <input placeholder="请输入年龄" wx:if="{{userInfo.baby_age != 0}}" value="{{userInfo.baby_age}}" class="xd-input"/>
 <input name="baby_age" placeholder="请输入年龄" wx:else value="" class="xd-input"/>
</view>
<button size="default" class="xd-abs xd-subBtn" formType="submit" hover-class="xd-subBtn-hover">保存</button>
</form>
</view>

css代码我就不贴了,一些样式而已。

对应的JS代码

var util = require('../../../utils/util.js')
var app = getApp()
Page({
 data: {
sex_items: [
 {name:'1', value:'小王子'},
 {name:'2', value:'小公主'},
 {name:'0', value:'尚无'}
],
logo:null,

userInfo: {}
 },

 //事件处理函数
 bindViewTap: function() {
wx.navigateTo({
 // url: '../logs/logs'
// url: '../load/load'
})
 },
 onLoad: function () {
console.log('onLoad')
var that = this
//调用应用实例的方法获取全局数据
app.getUserInfo(function(userInfo){
 //更新数据
 console.log(userInfo);
 that.setData({
 userInfo:userInfo,
 logo:userInfo.logo
 })
})
 },

 bindSaveTap: function(e){
console.log(e)
var formData = {
 uid:util.getUserID(),
 user_name:e.detail.value.nick_name,
 baby_sex:e.detail.value.baby_sex,
 baby_age:e.detail.value.baby_age
}
 console.log(formData)
app.apiFunc.upload_file(app.apiUrl.modify_user, this.data.logo, 'photos', formData, 
function(res){
 console.log(res);
},
function(){
})
 }, 

 chooseImageTap: function(){
let _this = this;
wx.showActionSheet({
 itemList: ['从相册中选择', '拍照'],
 itemColor: "#f7982a",
 success: function(res) {
 if (!res.cancel) {
 if(res.tapIndex == 0){
 _this.chooseWxImage('album')
 }else if(res.tapIndex == 1){
 _this.chooseWxImage('camera')
 }
 }
 }
})

 },
chooseWxImage:function(type){
let _this = this;
wx.chooseImage({
 sizeType: ['original', 'compressed'],
 sourceType: [type],
 success: function (res) {
 console.log(res);
 _this.setData({
 logo: res.tempFilePaths[0],
 })
 }
 })
 }
})

主要讲解一下JS代码

1、chooseImageTap方法

用来显示一个选择图片和拍照的弹窗,用到了微信的一个页面交互的api showActionSheet,点击查看详细使用

显示操作菜单

2、chooseWxImage方法

主要是用来选择图片以及接收图片路径回调的监听,点击查看详细使用

从本地相册选择图片或使用相机拍照

3、上传

在chooseWxImage方法的success回调中我们可以看到,我把返回的图片路径res.tempFilePaths[0] 赋值给了logo,下面我们只需要调用upload方法就ok了,微信的uploadFile方法被我封装了一下变成了upload_file。

uploadFile方法

//上传文件
function upload_file(url, filePath, name, formData, success, fail) {
console.log('a='+filePath)
wx.uploadFile({
 url: rootUrl + url,
 filePath:filePath,
 name:name,
 header: {
 'content-type':'multipart/form-data'
 }, // 设置请求的 header
 formData: formData, // HTTP 请求中其他额外的 form data
 success: function(res){
 console.log(res);
 if(res.statusCode ==200 && !res.data.result_code){
 typeof success == "function" && success(res.data);
 }else{
 typeof fail == "function" && fail(res);
 }
 },
 fail: function(res) {
 console.log(res);
 typeof fail == "function" && fail(res);
  }
 })
}

filePath就是upload_file中我们传进来的logo变量,也就是图片的绝对路径。

服务器的接收图片代码

看过我上篇文章登录流程的文章的都熟悉了我服务器用的是php框架是Laravel。

这里我只贴一下接收image的代码;

if(!empty($_FILES['photos'])){
   $up_arr['logo'] = upload_logo('photos','manage/images/user','logo',$user_id,0);
   $up_arr['logo'] = $up_arr['logo'][0];
   $user_info['logo'] = $Server_Http_Path . $up_arr['logo'];
 }

核心方法在upload_log中。

图片接收保存

if( !function_exists('upload_logo')){
 function upload_logo( $key_name='photos', $logo_path='manage/images/nurse', $pre_name='logo', $salt='20160101',$encode = 1,$make=0 ){
  $result_arr = array();
  global $Server_Http_Path,$App_Error_Conf;
  //分文件夹保存 
  $date_info = getdate();
  $year = $date_info['year'];
  $mon = $date_info['mon'];
  $day = $date_info['mday'];
  $logo_path = sprintf("%s/%s/%s/%s",$logo_path,$year,$mon,$day);
  if(!is_dir($logo_path)){
   $res=mkdir($logo_path,0777,true);
  }
  //图片上传
  //foreach($photos as $key => $photo ){
  $photo = $_FILES['photos'];
  $name = $key_name;

  $file_id = Input::file($name);
  if(!empty($file_id) && $file_id -> isValid()){
   $entension = $file_id -> getClientOriginalExtension();
   if($pre_name == 'baby'){
    $new_name = $pre_name . "_" . intval($salt) ."_" .time() . "_" . salt_rand(2,2);
   }else {
    $new_name = $pre_name . "_" . intval($salt) ."_" . salt_rand(2,2);
   }
   $path_id = $file_id -> move($logo_path,$new_name."_b.".$entension);
   if(!empty($path_id)){
    $path_name = $path_id->getPathName();
    $image_size=getimagesize($path_name);
 $weight=$image_size["0"];////获取图片的宽 

$height=$image_size["1"];///获取图片的高
if($pre_name == "baby" || $pre_name == "video") {   

   $photo_info['url'] = $path_name;  

   $photo_info['width'] = $weight;
  $photo_info['height'] = $height;
 $result_arr[] = $photo_info;
 }else{
 $result_arr[] = $path_name;
 } 
    //处理图片
if($make == 1){
 $img = Image::make($path_name)->resize(200, $height*200/$weight);
$img->save($logo_path ."/".$new_name."_s.".$entension);
 //dd($img);
 // return $img->response('jpg');
    }
   }
if(empty($result_arr)){
 $response['result_code'] = -1006;
 $response['result_msg'] = $App_Error_Conf[-1006];
  return response($response);
   }
 if($encode == 1){
    $result_arr = json_encode($result_arr);
   }
  }
  return $result_arr;
 }
 }

这个代码格式真的很烦人啊,我就大概整理了一下。

这样我们就入门了小程序图片上传和接口功能了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
node.js中watch机制详解
Nov 17 Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
利用js判断手机是否安装某个app的多种方案
Feb 13 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
Dec 20 Javascript
jQuery each和js forEach用法比较
Feb 27 jQuery
微信小程序可滑动月日历组件使用详解
Oct 21 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 Javascript
JS事件循环机制event loop宏任务微任务原理解析
Aug 04 Javascript
Vue Router中应用中间件的方法
Aug 06 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 #Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 #Javascript
Mac下使用charles遇到的问题以及解决办法
Jan 10 #Javascript
vue2滚动条加载更多数据实现代码
Jan 10 #Javascript
简单实现IONIC购物车功能
Jan 10 #Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
Jan 10 #Javascript
原生js实现水平方向无缝滚动
Jan 10 #Javascript
You might like
PHP中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php二维码生成
2015/10/19 PHP
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP模板引擎Smarty自定义变量调解器用法
2016/04/11 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
python检测服务器端口代码实例
2019/08/31 Python
python迭代器常见用法实例分析
2019/11/22 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
捷克时尚网上商店:OTTO
2018/03/15 全球购物
Troy-Bilt官网:草坪割草机、吹雪机、分蘖机等
2019/02/19 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
c语言常见笔试题总结
2016/09/05 面试题
大学生实习自我鉴定
2013/12/11 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
护理专科学生自荐书
2014/07/05 职场文书
校园元旦活动总结
2014/07/09 职场文书
工作失职检讨书
2015/01/26 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang