使用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\nodejs)

npm config set prefix "D:\Program Files\nodejs\node_global"
npm config set cache "D:\Program Files\nodejs\node_cache"

 

 執行完成后就可以看到紅框里面的文件夾了。ps:cache是使用了npm install下載了包之后才會創建

3、在系統環境變量添加系統變量NODE_PATH,輸入路徑D:\Program Files\nodejs\node_global\node_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網站做測試了

 

源碼參考:點這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM