微信小程序图片上传功能(提供前后端代码)

微信小程序图片上传功能(提供前后端代码)

最近有项目要用到图片上传功能,记录一下。做这个功能之前,要先配置好图片服务器,这个我有时间再整理配置方法。

微信小程序端

微信小程序图片上传采用的是wx.uploadFile这个函数,需要提前在微信小程序的官网将域名加入到这个函数中,还需要注意的一点是,wx.uploadFile与wx.request两个如果放在同一个模块中实现,会出现不同步的问题,两个函数是同时运行的,也就是说图片上传的反馈还没回来,提交表单的代码就已经执行了。导致图片上传不了表单。所以在编写代码时最好在选择图片时,就上传图片,然后再将反馈回来的图片信息通过wx.request提交给表单。

//选择图片与上传
 uploadimg: function () {
    var that = this;
    var source = that.data.source;
    wx.chooseImage({  //从本地相册选择图片或使用相机拍照
      count: 9, // 默认9
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有

      success: function (res) {
        //console.log(res)
        //前台显示
        that.setData({
          source: res.tempFilePaths
        })

        // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
        var tempFilePaths = res.tempFilePaths
        // console.log(tempFilePaths)
        for (var i = 0; i < tempFilePaths.length; i++) {
          if (source.length >= 9) {
            that.setData({
              source: source
            });
            return false;
          } else {

      var imgurllist = that.data.imgurllist;
      // console.log(tempFilePaths.length)
      var count = 0;
      wx.uploadFile({
        url: 你的URL
        filePath: tempFilePaths[i],
        name: 'uploadfile_ant',
        header: { "content-type": "application/json", "Cookie": "PLAY_SESSION=" + getApp().data.cookied },
        success: function (res) {
          count++;
          var imgmessage = JSON.parse(res.data)
          //  console.log(imgmessage.imgurl)
          if (imgmessage.state == "success") {
            that.setData({
              acjson: imgmessage.imgurl,
              imgurllist: imgmessage.imgurl,
            })
            imgurllist.push(imgmessage.imgurl);
            that.setData({
              imgurllist: imgurllist
            });
            //  console.log(that.data.imgurllist)
          } else {
            wx.hideLoading();
          }
          //如果是最后一张,则隐藏等待中  
          if (count == that.data.source.length) {
            wx.hideToast();
          }
        },
        fail: function (res) {
          wx.hideToast();
          wx.hideLoading();
          wx.showModal({
            title: '错误提示',
            content: '上传请假条失败',
            showCancel: false,
            success: function (res) {
            }
          })
        }
      });

            source.push(tempFilePaths[i]);
          }
          that.setData({
            source: source
          });
        }



      }
    })
  },

//删除图片功能
  deleteImg: function (e) {
    var source = this.data.source;
    var index = e.currentTarget.dataset.index;
    source.splice(index, 1);
    var imgurllist = this.data.imgurllist;
    imgurllist.splice(index, 1);
    this.setData({
      source: source,
      imgurllist: imgurllist
    });
  },
//获取图片索引
  previewImg: function (e) {
    //获取当前图片的下标
    var index = e.currentTarget.dataset.index;
    //所有图片
    var source = this.data.source;
    wx.previewImage({
      //当前显示图片
      current: source[index],
      //所有图片
      urls: source
    })
  },

后台处理

后台使用的语言是Scala,可以用分布式文件系统——FastDFS用来保存图片,也可以直接在nginx配置图片服务器,在映射到本地,本次后面那种方法,

 def fastdfsupload = authAction.async(parse.multipartFormData) {request =>
    Future{
      if(request.userInfo.map(_.id.last).getOrElse(0)!=0)
      {
        request.body.file("file").map { picture =>
//
          val filename = picture.filename
          val contentType = filename.substring(filename.lastIndexOf("."))
          val furl= UUID.randomUUID.toString+contentType

          picture.ref.moveTo(new File(XwConstant.setimgurl+furl),replace = true).setReadOnly()
         val path1=XwConstant.httpsurl+XwConstant.getimgurl+furl
         // Runtime.getRuntime.exec("chmod 777 " + path1) //给文件夹权限
          if(picture.ref.length()<1024*1024){
            val pictype="#@#DSA"+picture.contentType.last
            if(pictype.contains("#@#DSAimage/")){
              //val backurl=FastDFS.xbUpload(picture.ref,env.rootPath().getPath+"/conf/fdfs_client.conf",picture.filename.split('.').toList.last)  //这个是用了分布式文件系统——FastDFS  本次可以直接保存在本地的图片服务中,再在nginx配置好就可以了
              if(path1!="error"){
                Ok(Json.toJson(Map("state"->"success","imgurl"->path1)))
              }else{
                Ok(Json.toJson(Map("state"->"error1","msg"->"not found")))
              }
            }else{
              Ok(Json.toJson(Map("state"->"imageerror","msg"->"is not image")))
            }
          }else{
            Ok(Json.toJson(Map("state"->"error","msg"->"图片太大")))
          }

        }.getOrElse(
          Ok(Json.toJson(Map("state"->"error2","msg"->"p not found")))
        )
      }
      else
        Ok(Json.toJson(Map("state"->"error3","msg"->"u not found")))
    }
  }

路径文件

  /**
    * 保存img地址
    */
  val setimgurl="E:/XXX/XXXX/tem/"
  /**
    * 获取路径地址
    */
  val getimgurl="XXXX"

  /**
    * URL
    */
  val httpsurl="你的IP地址"

 

你可能感兴趣的:(Scala,微信小程序)