小程序选择图片、预览,上传到阿里云

小程序开发过程中需要用户发布内容,图片、文字、视频,在小程序里发布有自己的api,感觉比html要方便的多。
需求:一个发布页面,选择图片按钮,和选择视频按钮,点击图片可以选择多张图,图片和视频不能同时存在,这边我们是文件直接上传到阿里云的,剩余在和后端交互。话不多说,进入正题。
老样子,先上文档,

一、选择图片并预览 点击查看微信文档

选择成功回调

image.png

1、参数就不过多解读了,大家都看得懂,因为选择9张图,所以在回调里做判断图片个数,上个demo

//选择图片
chooseImg() {   
      let that = this,
      worksImgs = this.data.worksImgs; //存储本地图片的数组   
    wx.chooseImage({
      count: 9 - worksImgs.length, //剩余可选几张照片
      sizeType: ['original', 'compressed'],  //可选择原图或压缩后的图片
      sourceType: ['album', 'camera'], //可选择性开放访问相册、相机
      success(res) {
        // tempFilePath可以作为img标签的src属性显示图片
        const images = worksImgs.concat(res.tempFilePaths)   //把选择的照片放入worksImgs         
        that.setData({
          worksImgs: images
        })
      },
      error(res) {
       // 这里的operate.hintToast() 是我自己封装的一个错误提示方法
        operate.hintToast(res.errMsg);
      }
    })
}

2、正常选择图片都可以进行删除,就是删除上面存储图片的数组中对应的元素,so:

wxml:
<block wx:for="{{worksImgs}}" wx:key="key">
      <view class="box">
        <image src="{{item}}" mode="aspectFill"></image>
        <view class="weui-icon" data-index="{{index}}" bindtap="deleteImg"></view>
      </view>
    </block>
JS: 
// 删除图片 对应每个图片右上角的x号
  deleteImg(e) {
    let worksImgs = this.data.worksImgs;
    let itemIndex = e.currentTarget.dataset.index;
    worksImgs.splice(itemIndex, 1);
    this.setData({
      worksImgs: worksImgs
    })
  },

3、在选择图片之前判断是否有视频资源,图片和视频不能同时存在,

if (this.data.videoSrc) {
      operate.hintToast('无法同时选择发布视频和图片!');
      return false;
};

4、上传到阿里云:

选择图片之后上传到阿里云,这一步需要提前设置你的阿里云可以允许访问,并且在小程序配置里把你的阿里云地址加上去,位置在小程序-开发-开发设置-服务器域名,
配置域名

如果请求出现oss跨域请求,可能是你的阿里云地址没有设置跨域规则,参考 跨域CORS规则设置,官方介绍的很清楚,按着配置就行。

  • 上传需要用到wx.uploadFile,如图:
    uploadFile

上传到阿里云,需要注意你的阿里云是RAM还是STS,我们STS临时授权的,所以需要动态获取阿里云账号口令放在app.globalData里;看了几个固定的(RAM格式)是直接放在文件里的;

  • 在需要上传文件的page页面,进行口令验证,如果过期了就重新请求新的口令;
    上传的相关文件我放在GitHub
    里,upload文件夹下是上传阿里云相关文件,其中uploadFile.js 上传主要文件,其他是相关算法 ,不做详细解释,具体说一下其中需要注意的几个点;(下载可以直接使用,但是要改成你自己的地址)
    (1)动态STS需要设置x-oss-security-token,不可少!
//请求到你的阿里云密令进行赋值
const formData = {
    key: aliyunFileKey,
    policy: policyBase64,
    OSSAccessKeyId: accessid,
    signature: signature,
    success_action_status: '200',
    'x-oss-security-token':env.stsToken
  };

(2)上传文件时需要设置上传文件的限制大小,图片一般不会超,视频超出如果没有限制,会报错的!!!(一定要注意)

在getPolicyBase64 这个方法里进行设置(封装在uploadFile.js )

const getPolicyBase64 = function (num) {
  // 视频 250M  图片 20M
  let date = new Date();
  date.setHours(date.getHours() + env.timeout);
  let srcT = date.toISOString();
  const policyText = {
    "expiration": srcT, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 
    "conditions": [
      ["content-length-range", 0, num * 1024 * 1024] // 设置上传文件的大小限制
    ]
  };
  const policyBase64 = base64.encode(JSON.stringify(policyText));
  return policyBase64;
};
  • 接着上传,因为是多图上传,常规我们想到的就是for循环,但是for循环不能保证每次循环都是在上一张图片成功之后在进行下一次,所以可能产生图片顺序错乱;由此,我们在每次成功之后在执行下一次上传,保证图片是按照正确的顺序。
  • 因为在过程中用户会对图片进行删除,替换等,我们把上传图片放在最后点击发布按钮的时候,先上传文件到阿里云,拿到回调地址,再传给后端进行发布。
下面这一段是上传核心代码
uploadImg: function (i) {
    let that = this, worksImgs = that.data.worksImgs;
    let nowTime = util.formatTime(new Date());
    console.log(i,worksImgs);
    wx.showLoading({
      title: '发布中...',
      mask: true
    });
    if (i >= worksImgs.length){
      that.publish();
    }else if (worksImgs[i].indexOf('oss-cn-hangzhou.aliyuncs.com') > -1 ){
      //判断当前图片是不是已经上传过的
      i++;
      if (i >= worksImgs.length) {
        that.publish();//最后一张上传完成,进行其他操作发布    
      } else {
        that.uploadImg(i)
      };
    }else{
// 这里是uploadImage 方法传的几个参数(图片的本地资源路径,要传到哪个目录下)
      upload.uploadImage(worksImgs[i], 'sds/xcx/your/'+ '-' + nowTime,
          function (result) {
            console.log("======上传成功图片地址为:", result);
            let temp = 'worksImgs['+i+']';
            that.setData({
              [temp]: result
            });
            console.log(that.data.worksImgs)
          }, function (result) {
            console.log("第" + (i + 1) + "张上传失败" , result)
            operate.hintToast("第" + (i + 1) + "张上传失败:"+result)
          },function(com){
            i++;
            if (i >= worksImgs.length) {
              that.publish(); //最后一张上传完成,进行其他操作发布            
            } else {
              that.uploadImg(i)
            };
          }
        )
      }
  },

效果见下图:


1.gif

点击查看源文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354