基于小程序·云开发的HTTP API实现图片上传功能

基于小程序·云开发HTTP API构建小程序的后台内容管理系统的相关技术文章连载。本文章主要介绍:基于HTTP API实现图片上传功能。


基于HTTP API实现内容管理的图片上传功能

目前基于小程序·云开发可以快速的实现无服务器的小程序快速开发。但是小程序开发工具自带的管理工具,并不方便进行内容管理。因此为了更高效的管理小程序,需要开发后台管理工具,以方便在电脑端进行内容管理。基- 于此,会陆续连载更新基于小程序·云开发HTTP API进行后台管理工具相关开发的一些经验文章。

  • 前端:Element-admin
  • 后端:Node.js koa
前端使用element-ui el-upload组件实现上传功能
  • 对于element-admin以及element-ui不熟悉的请自行去官网学习。
  • element-admin是基于element-ui组件构建的后台管理系统UI,功能强大,方便快速构建后台管理系统。

Element-admin:https://panjiachen.github.io/vue-element-admin-site/zh/
Element-ui:https://element.eleme.io/#/zh-CN

<template>
  <div class="dashboard-container">
    <div>
      <el-upload
        class="upload-demo"
        action="http://localhost:3000/upload/imgs"
        :before-upload="beforeUploadFile"
      >
        <el-button size="small" type="primary">点击上传</el-button>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
      </el-upload>
    </div>
  </div>
</template>
后端基于node koa的后端图片上传功能代码

学习技术的最好方法就是官方文档,因此要想熟练的使用HTTP API构建小程序的后端管理系统,就必须先熟悉官方文档。

1.要想使用Httpapi去实现图片上传功能,我们需要先获取访问请求中的参数access_token。access_token获取的官方文档内容。

image

通过官方文档可知,传递参数appid和secret,发送请求到文档中的地址,可以获取access_token数据access_token获取,存储以及定时更新的相关代码如下:

const rp = require('request-promise')
const fs = require('fs') //引用文件操作函数
const path = require('path') //引入文件路径函数

//获取文件的绝对路径
const filePath = path.resolve(__dirname, './access_token.json')

//小程序的APPID和Secret
const APPID = '小程序的APPID'
const Secret = '小程序的Secret'
//获取Token的URL
const URL = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${Secret}`

//从小程序端获取Token函数
const updateAccessToken = async () => {
    const resStr = await rp(URL)
    //将字符串类型转为对象
    const res = JSON.parse(resStr)
    if (res.access_token) {
        //写入文件
        fs.writeFileSync(filePath, JSON.stringify({
            access_token: res.access_token, //从小程序服务器获取的token
            createTime: new Date() //获取token时,对应的时间
        }))
    } else { //如果文件不存在,则重新调用获取token函数,重新执行写入
        await updateAccessToken()
    }
}

//查询Token函数返回给响应的函数去调用云函数
const getAccessToken = async () => {
    try {
        //读取文件
        const readRes = fs.readFileSync(filePath, 'utf8')
        const readObj = JSON.parse(readRes)
        //获取access_token.json中的createtime的时间
        const createTime = new Date(readObj.createTime).getTime()
        //获取当前时间
        const nowTime = new Date().getTime()
        //判断Token的失效是否大于2小时,如果大于2小时则需要重新获取Token,然后在读取Token数据
        if ((nowTime - createTime) / 1000 / 60 / 60 >= 2) {
            await updateAccessToken()
            await getAccessToken()
        }
        //返回Token数据
        return readObj.access_token
    } catch (error) { //如果access_token文件不存在,则读取报错,此时需要重新从服务器获取token数据,再读取token数据
        await updateAccessToken()
        await getAccessToken()
    }
}

//定时更新Token
setInterval(async () => {
    await updateAccessToken()
}, (7200 - 300) * 1000)

module.exports = getAccessToken;

2.获取文件上传链接
从官方文档可知,传递access_token和env参数,访问文档中的请求地址,获取上传文件所需的参数数据。

image

从官方文档可知,返回的上传数据中包含如下内容:

  • authorization字段
  • token字段
  • cos_file_id字段
  • url字段

3.上传文件到云存储
按照官方文档,访问返回的url字段的链接,并传递相关参数,将图片上传到云存储。

image

图片上传功能的代码如下:

const rp = require('request-promise')
const fs = require('fs') //引用文件操作函数
const getAccessToken = require('./getAccessToken')

const cloudStorage = {
    // 1、请求地址
    async upload(ctx){
        console.log(1,ctx)
        const ACCESS_TOKEN = await getAccessToken()
        const file = ctx.request.files.file
        const path = `test/${Date.now()}-${Math.random()}-${file.name}`
        var options = {
            method: 'POST',
            uri: `https://api.weixin.qq.com/tcb/uploadfile?access_token=${ACCESS_TOKEN}`,
            body: {
                env: 'miniprogram-dev-y7a0a',
                path,
            },
            json: true // Automatically stringifies the body to JSON
        };
        //请求返回的参数
        const info = await rp(options)
            .then(res => {
                // POST succeeded...
                return res
            })
            .catch(err => {
                // POST failed...
                console.log(err)
            });
        
        // 2、上传文件到云存储
        const params ={
            method: 'POST',
            uri:info.url,
            header:{
                'content-type':'multipart/form-data'
            },
            formData:{
                key:path,
                Signature:info.authorization,         
                'x-cos-security-token':info.token,      
                'x-cos-meta-fileid':info.cos_file_id,
                file:fs.createReadStream(file.path)
            },
            json: true // Automatically stringifies the body to JSON
        }
        await rp(params)
        return info.file_id
    }
}

module.exports=cloudStorage;

欢迎大家关注我,后续会陆续更新相关技术文章,来帮助大家快速熟悉和使用小程序·云开发实现小程序的快速开发,以及基于HTTP API实现小程序后端管理系统的开发。

转载请注明出处,否则一经发现,违者必究。

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