1. 程式人生 > >Hbuilder開發app實戰-識歲04-七牛雲上傳檔案的js實現

Hbuilder開發app實戰-識歲04-七牛雲上傳檔案的js實現

七牛雲上傳
七牛雲的上傳支援很多種語言,我用過的有java和js,個人感覺都比較方便,

當然java要比js方便一點吧,由於是app中要上傳到七牛雲,所以不可能使用java,

就看拉看七牛雲的js上傳,詳見這裡:http://developer.qiniu.com/docs/v6/api/overview/up/form-upload.html,

這種文件一向是不想讀的,沒有demo,讀起來費勁,而且遺漏一兩個細節得查詢好半天。

簡單的來說就是給普通的上傳表單新增一些欄位,其中包括自己生成的uptoken。

上傳憑證
這個上傳表單中最重要的就是上傳憑證uptoken的生成,見官網說明:

http://developer.qiniu.com/docs/v6/api/reference/security/upload-token.html,

簡單的說明下過程:構建js物件,轉json,一系列編碼。


首先來說下構建js物件,見下圖:

需要構建的就是這樣一個js物件,但是官方說明太簡單了,其中有好多坑的。

第一個坑,scope,

這個屬性是由你的七牛雲bucket名稱和檔名稱組成的,

官方還說如果不想定義具體的檔名稱可以設定bucket名稱,

這就是一個坑,為啥呢?

如果只設置bucket的話,那會自動生成一個沒有檔案字尾的地址,

例如正常的訪問地址是:http://qiniu.com/xxx.png,

那麼這時候生成的地址就是:http://qiniu.com/xxxxxx,

是沒有後綴的,

雖然這樣訪問也可以正確顯示圖片,

但是坑來了,face++不能識別,因為face++做了字尾判斷,

我相信也會有很多地方都做字尾判斷吧,

所以還是怪怪的加上檔名稱吧。

第二個坑,deadline,

官網只說了截止時間,一看就是毫秒數,

但是你用各種工具生成毫秒數,你都會發現比官網提供的數字要多三位,

這是為什麼呢?為什麼呢?太坑了,官網毫無提示。

最後實在官網的一個校驗工具中找到的:

[js] view plain copy
Math.round(new Date().getTime() / 1000) + 3600;  
就這麼用吧,懶得去追究了。

封裝方法
搞明白了以上兩點,那接下來就好走多了,或者說相對好走多了,

接下來就是js物件轉json,還有base64編碼,url安全的base64編碼,SHA1加密,HMAC-SHA1加密。

加密和密碼切不論,來看看整體的封裝:

[js] view plain copy
// qiniu  
qiao.qiniu = {  
    ak : '3YhXI8s0TsYLyEv_irq7aKGsQsmN6i3WoERBtnyY',  
    sk : '9lWh6588LIrQcrMpTagR0f19KV_BcRvtgu5Z1mFU',  
    pr : 'http://7xl3r9.com1.z0.glb.clouddn.com/',  
    scope : 'uikoo9-facepp',  
};  
qiao.qiniu.deadline = function(){  
    return Math.round(new Date().getTime() / 1000) + 3600;  
};  
qiao.qiniu.genScope = function(src){  
    var scope = qiao.qiniu.scope;  
    if(src){  
        var ss = src.split('.');  
        qiao.qiniu.file = qiao.qiniu.uid() + '.' + ss[ss.length - 1];  
        scope = scope + ':' + qiao.qiniu.file;  
    }  
      
    return scope;  
};  
qiao.qiniu.uid = function(){  
    return Math.floor(Math.random()*100000000+10000000).toString();  
};  
qiao.qiniu.uptoken = function(src) {  
    //SETP 1  
    var putPolicy = '{"scope":"' + qiao.qiniu.genScope(src) + '","deadline":' + qiao.qiniu.deadline() + '}';  
  
    //SETP 2  
    var encoded = qiao.encode.base64encode(qiao.encode.utf16to8(putPolicy));  
  
    //SETP 3  
    var hash = CryptoJS.HmacSHA1(encoded, qiao.qiniu.sk);  
    var encoded_signed = hash.toString(CryptoJS.enc.Base64);  
  
    //SETP 5  
    var upload_token = qiao.qiniu.ak + ":" + qiao.encode.safe64(encoded_signed) + ":" + encoded;  
    return upload_token;  
};  
qiao.qiniu.url = function(key){  
    return qiao.qiniu.pr + qiao.qiniu.file;  
};  
qiao.qiniu是初始化資訊,包括你七牛雲的ak,sk,地址,bucket名稱,

qiao.qiniu.deadline就是之前說的截止時間,

qiao.qiniu.uid是獲取一個uuid,因為你要傳檔名,而你不可能用使用者的檔名,如果兩個使用者都上傳1.png你該怎麼辦?

qiao.qiniu.genScope是生成js物件中的scope屬性,原因之前已經說過了,由於檔名之後還要用,所以儲存到了qiao.qiniu.file中,

qiao.qiniu.uptoken就是官網告訴你的幾個步驟,包括轉json,base64,和sha1加密。

最後恭喜你,你總算得到了一個正確的uptoken。

加密
加密比較複雜,單獨開一節來講,請見下一節。
--------------------- 
作者:uikoo9 
來源:CSDN 
原文:https://blog.csdn.net/uikoo9/article/details/47924689 
版權宣告:本文為博主原創文章,轉載請附上博文連結!