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

文/YXJ

地址:http://blog.csdn.net/sk719887916/article/details/54312573

前几天做了图片上传功能,被坑了一下。我们来看一下微信的上传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;
     }
   }

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

时间: 2024-08-02 10:51:16

微信小程序开发(二)图片上传+服务端接收的相关文章

微信小程序开发(二)-----项目的创建

项目创建的步骤:(以mac版为例) 1.在"应用程序"中,双击"微信web开发者工具.app", 如图: 2. 选择类型 3.点击"+" 4.点击无AppID 注:因为没有开发资格所以要选择无AppID 5.填写项目名称和项目目录 注意两点: 1.项目文件夹不能用中文; 2.新建项目文件夹要建一个空的文件夹. 6.新建之后的文件目录结构 app.js------应用程序逻辑 app.json------应用程序配置 app.wxss------应

微信小程序开发教程目录

本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 微信小程序开发之picker 微信小程序开发之图片预览 微信小程序开发之模板 微信小程序开发之模板消息

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

解决微信小程序开发中wxss中不能用本地图片

微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方法:将图片用base64加密. 1.我们用在线加密对图片进行加密,这个网址百度一大堆,我只贴出一个http://imgbase64.duoshitong.com/ 2.将转换完成后的base64复制到我们要引用的地方. 3.设置样式(辅助代码,只有将这个图片做为background-image时注意设置如下属

微信小程序开发之普通链接二维码

本文主要介绍扫普通链接二维码打开小程序, 详情请看官方文档https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html 配置普通链接二维码规则 生成二维码 访问https://cli.im/url,将https://test.com/linkcode?id=1_2生成二维码图片 小程序接收参数 if(option.q){ console.log(option.q); var link = decodeURIComponent(opt

微信小程序开发工具使用与设计规范(二)

上一篇文章主要分析了微信小程序应用场景和优劣势.本篇你可以学习到: 如何使用小程序开发工具写一个Hello World 微信小程序设计规范 微信小程序项目结构 >>>微信小程序开发工具使用 下载安装小程序 下载 :微信web开发者工具 下载:官方DEMO源码 本系列教程使用的是mac版的开发者工具. 安装完成后,打开微信web开发者工具 1.扫码登录,绑定个人微信 2.扫码登录后,新建或导入已有项目(这里使用官方提供的DEMO源码quickstart) 3.新建项目,导入刚下载的quic

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic

我们的微信小程序开发

基于微信小程序的系统开发准备工作 腾讯推出微信小程序也有一段时间了,在各种行业里面也都掀起一阵阵的热潮,很多APP应用被简化为小程序的功能迅速推出,同时也根据小程序的特性推出各种独具匠心的应用,相对传统的APP来说,微信小程序确实能够大大降低开发成本和难度,但也意味着需要掌握整个微信小程序的各种接口功能.应用场景等相关技术点,本篇随笔先从大的方面来介绍微信小程序开发的一些知识,如架构设计.技术路线 .工具准备等方面做一些浅薄的介绍,希望大家也有所收益,有所借鉴,则善莫大焉. 1.小程序的统一架构

小程序&#183;巧应用,微信小程序开发实战

系统全面地讲解微信小程序的开发技术.开篇创建一个小程序项目并解析体验,介绍如何由零开始创建一个小程序,全面体验小程序的开发工具.界面.开发框架.实现过程及其主要代码框架,了解小程序的应用场景及开发要求.接着介绍小程序开发基础,包括小程序开发的语言与语法.函数方法.模块.事件交互等.然后详细介绍了组件的应用与开发,包括开发过程与组件应用技巧,还详细分析了API接口,包括使用各个微信原生API接口进行小程序开发的技巧.最后介绍了几个小程序实战案例,让读者实践小程序各项能力的应用及掌握一些应用技巧.本