• 使用koa2做一个简单的图片上传web


    功能的简述:

    此web页面的开发依赖于微信小程序的http api接口,通过小程序http api的相关接口(auth.getAccessToken、uploadFile、databaseAdd),将本地图片通过web上传到云存储中

    本地web页面使用了koa2的koa-generator,能够快速的搭建本地web环境(里面用到的几个模块:axios.min.js、request、request-promise、fs)

    Node基础安装配置参考:https://www.cnblogs.com/liaojie970/p/9296177.html

    启动web:命令提示符定位到项目文件夹下,执行:npm start

    启动后通过localhost:3000来访问

    1、安装Node.js

    2、改变原有的环境变量(假设:node的安装路径D:Program Files odejs)

    npm config set prefix "D:Program Files
    odejs
    ode_global"
    npm config set cache "D:Program Files
    odejs
    ode_cache"

     执行完成后就可以看到红框里面的文件夹了。ps:cache是使用了npm install下载了包之后才会创建

    3、在系统环境变量添加系统变量NODE_PATH,输入路径D:Program Files odejs ode_global ode_modules,此后所有安装的模块通过npm install xxxx -g都会安装到改路径下(-g表示安装在global目录下)

    4、在命令行输入以下命令试着安装express

    npm install express -g

    完成后再对应目录能看到express文件夹

     5、在命令行输入node进入编辑模式,输入以下代码测试是否能正常加载模块:

    require('./express')

    如果这里出错,则要检查环境变量的配置看是否正确

    6、安装淘宝npm(cnpm)

    a、输入:

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    b、环境变量--添加用户变量

    c、打开cmd命令提示符  输入 cnpm -v   如果系统没有报错则说明配置OK了

    7、安装 koa-generator

    cnpm install koa-generator -g

    8、创建网站目录(命令提示符进入到你想创建的目录下,默认是在c:盘的)

    koa2 practice-cms -e

    9、进入刚才创建的目录下执行以下命令,安装初始模块

    cnpm i 

    10、执行npm start,启动网站

    npm start

    成功后会在cmd命令提示符下显示

    11、在浏览器输入localhost:3000  浏览网站

    12、下载vscode,打开刚才创建的practice-cms文件夹

       public文件夹是放一些静态资源的 里面的javascripts文件夹需要下载个axios.min.js文件,此文件可以发起ajax

       routes文件夹主要是路由
       views是前台页面展示

    13、找到views目录下index.js,编辑内容为:

    <!DOCTYPE html>
    <html>
      <head>
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
        <script src="/javascripts/axios.min.js"></script>
      </head>
      <body>
        <h1>交友-CMS</h1>
        <label for="">
          上传图片:<input type="file" id="uploadBtn">
        </label>
    
        <script>
          //获取上传控件的对象
          var uploadBtn = document.getElementById('uploadBtn');
          uploadBtn.onchange = function(e){
            var file = e.target.files[0];   //获取上传的文件
            var param = new FormData();     
            param.append('file',file);
    
            var config = {
              headers : {
                'Content-Type':'multipart/form-data'  //头部文件类型定义
              }
            };
            //调用后端uploadBannerImg接口,具体定义在routes文件夹下index.js内
            axios.post('/uploadBannerImg',param,config).then((res)=>{  
    
              console.log( res.data )
    
            });
    
          }
        </script>
      </body>
    </html>
    View Code

    14、回到命令提示符界面使用Ctrl+c  取消当前运行的网站,再用npm start重新跑一边网站加载最新的修改页面

    15、在vs中找到routes文件夹下的index.js,新增刚刚在web前端页调用的/uploadBannerImg方法

    router.post('/uploadBannerImg',async (ctx,next)=>{
      var files = ctx.request.files;
      console.log(files)
    })
    View Code

    16、再次停止网站,再次运行 然后刷新页面后选择一张照片,再打开命令提示符,正常的话在命令提示符下能看到图片的名字和路径了

    但是此时还是看不到,原因是少安装了一个模块

    17、停止网站,执行:cnpm i -S koa-body

    18、在practice-cms的文件夹下找到app.js,打开引入一下新下载的koa-body

    const koaBody = require('koa-body')

    再做一个简单的图片上传配置

    app.use(koaBody({
      multipart:true,
      formidable:{
        maxFileSize:200*1024*1024    //设置上传文件的大小,默认2M
      }
    }))

     19、再次运行网站,上传图片则再命令提示符下就能看到对应的图片路径了

     20、在practice-cms目录新建config.js,将微信小程序的appId和secret存在配置文件中备用

    module.exports={
        appId:'',
        secret:''
    };

    21、在routes的index.js文件引入刚刚新建的config.js文件

    const config = require('../config.js')

    22、cmd提示符定位到practice-cms安装koa框架需要的request和request-promise      ps:这两个模块是专门用来做Http请求的

    cnpm i -S request request-promise

    23、在routes的index.js文件再引入

    //引入koa2对外http请求的类
    const request = require('request-promise')
    //引入文件操作类(内置的)
    const fs = require('fs')

    24、完善/uploadBannerImg方法

    //接收web页面传到后台的文件
    router.post('/uploadBannerImg',async (ctx,next)=>{
    
      var files = ctx.request.files;
      var file = files.file;
      //console.log(files)
      try{
        
        //发起get请求,获取access_token
        let options = {
          uri:'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + config.appId + '&secret=' + config.secret,
          json:true
        }
    
        let {access_token} = await request(options)
        //console.log(access_token);
        let fileName = `${Date.now()}.jpg`;   //es6模板字符串写法
        let filePath = `banner/${fileName}`;
        
        //发起post请求,获取上传图片链接的url地址
        options = {
          method:'POST',
          uri:'https://api.weixin.qq.com/tcb/uploadfile?access_token=' + access_token,
          body:{
            "env":config.env,    //云数据库ID
            "path":filePath  //图片路径
          },
          json:true
        }
    
        let res = await request(options);   //发起请求并接受返回参数
        let file_id = res.file_id;  //获取返回的文件ID值
    
        options = {
          method:'POST',
          uri:'https://api.weixin.qq.com/tcb/databaseadd?access_token=' + access_token,
          body:{
            "env":config.env,  //云数据库ID
            "query":"db.collection("banner").add({data:{fileId:"" + file_id + ""}})"
          },
          json:true
        }
        
        //将拿到的file_id插入到云数据的banner集合中
        await request(options);
    
    
        //再次组装数据,将本地的图片以文件流的形式组装好,通过上传连接把图片上传到云存储中
        options = {
          method:'POST',
          uri:res.url,
          formData:{
            "signature":res.authorization,
            "key":filePath,
            "x-cos-security-token":res.token,
            "x-cos-meta-fileid":res.cos_file_id,
            "file":{
              value:fs.createReadStream(file.path),
              options:{
                filename:fileName,
                contentType:file.type
              }
            }
          }
        }
    
        await request(options);
        ctx.body = res;
    
      }catch(error){
        console.log(error.stack);
      }
    
    
    })
    View Code

    25、设置好后就可以重启web网站做测试了

    源码参考:点这里

  • 相关阅读:
    cf1131f 构造+并查集
    多源最短路小结
    bzoj2200拓扑排序+最短路+联通块
    cf478d 线性dp好题
    cf919D 线性dp+拓扑排序
    hiho1460 rmq模板题
    最小标示法模板 poj1509
    JAVA动态代理机制分析guide
    java动态代理(JDK和cglib)
    AOP面向切面编程
  • 原文地址:https://www.cnblogs.com/yhnet/p/12306519.html
Copyright © 2020-2023  润新知