(转)七牛云文件上传aardio调用库分享

By admin at 2021-02-28 • 0人收藏 • 461人看过

感谢: 周 (332XXX281) 分享


qiniuyun.aardio 库代码如下:

import web.rest.jsonClient;  
import crypt.hmac;
import crypt.bin; 
import fsys.ini

namespace qiniuyun;

class auth{
	ctor(accessKey,secretKey){
		this = ..web.rest.jsonClient() 
		this.accessKey = accessKey
		this.secretKey = secretKey;
		this.ini = ..fsys.ini("/config.ini")
		
		base64_urlSafeEncode = function(str){
			str = ..string.replace(str,'+', '-');
			return ..string.replace(str,'/', '_');
		}
		
		
		uploadToken = function(bucket,fileName,override){
        	var scope = bucket;
        	if (override == true ) {
            	scope += ':' ++ fileName;
        	}
        	var deadline = tonumber(..time()) + 3600;
        	var putPolicy = ..string.format('{"scope":"%s","deadline":%i}' ,scope,deadline)
			var encoded = ..crypt.bin.encodeBase64(putPolicy)
			var encoded_signed = base64_urlSafeEncode(..crypt.bin.encodeBase64( ..crypt.hmac.sha1(this.secretKey , encoded ).getValue() ))
			return this.accessKey + ":" + encoded_signed + ":" + encoded;
		}
	
	};
	
	uploadFile = function(bucket,filePath,fileName,override){
		
		
		var url = this.ini.read("http","up")
		if(url == null){
			var res = this.api('https://uc.qbox.me/v1/query?ak='++ this.accessKey ++'&bucket='++bucket).get()
			url = res.http.up[1]
			this.ini.write("http","up", url )
		}
		
		
		if(fileName == null){
			fileName = ..io.splitpath(filePath).file
		}
		var token = uploadToken(bucket,fileName,override) ;
		
		var restApi = this.api(url++"/")
		this.sendMultipartForm( {
			key = fileName;
			token = token;
 			file = "@"++filePath;
 			}
		)  
		return restApi();
	}	
}

调用示例: 注意下面的key请去七牛云申请,然后替换为你申请到的

accessKey = 'accessKey ';
secretKey = 'secretKey ';
bucket = 'bucket ';

qiniu = qiniuyun.auth(accessKey,secretKey) 
console.dump(qiniu.uploadFile(bucket,'E:/q.txt','haha.txt')) //普通上传
console.dump(qiniu.uploadFile(bucket,'E:/q.txt','haha.txt',true)) //覆盖上传


4 个回复 | 最后更新于 2021-04-11
2021-03-04   #1

直接用 crypt.bin.encodeUrlBase64() 函数就可以。


uploadToken 的定义有问题,类里面变量默认是类名字空间的静态变量(所有类实例共享),所以应当改成 this.uploadToken  = .......

一般静态变量应当写在 namespace className {  uploadToken  = ...... }  这里面。这样结构会清析一些。

2021-03-06   #2

回复#1 @jacen_he :

crypt.bin.encodeUrlBase64() 会把 = 号替换掉。七牛云好像弄的并不标准。


2021-03-06   #3

回复#2 @zhoubujin : 根据  RFC4648 等号是可选的,加不加都符合标准,常见的是移除等号,我改进了一下可以 crypt.bin.encodeUrlBase64(str,,true) 指定保留等号。

这里不建议写 ini 文件,用一个缓存表放一下动态获取的URL就可以,我改进了一下这个库,供参考:

import crypt.bin; 
import crypt.hmac;
import web.rest.jsonClient; 
    
namespace qiniuyun{
    
    class uploader{
        ctor(accessKey,secretKey){
            this = ..web.rest.jsonClient() 
            this.accessKey = accessKey
            this.secretKey = secretKey; 
                
            this.getUploadToken = function(bucket,fileName,override){
                var scope = bucket;
                if (override == true ) {
                    scope += ':' ++ fileName;
                }
                var deadline = tonumber(..time()) + 3600;
                var putPolicy = ..string.format('{"scope":"%s","deadline":%i}' ,scope,deadline)
                var encoded = ..crypt.bin.encodeBase64(putPolicy)
                    
                var encoded_signed = ..crypt.bin.encodeUrlBase64( ..crypt.hmac.sha1(this.secretKey , encoded ).getValue(),,true )
                return this.accessKey + ":" + encoded_signed + ":" + encoded;
            }
            
            this.qbox = this.api("https://uc.qbox.me/v1/","GET" )
                this.cacheUploadUrl = {
                    @{_weak="kv"}
                } 
        };
        
        getUploadUrl = function(bucket){
            var url = this.cacheUploadUrl[bucket];
            if( url ) return url;
            var res,err = this.qbox.query(,{
                ak = this.accessKey;
                bucket = bucket
            })
            
            if(res){
                var url  = res.http.up[1];
                this.cacheUploadUrl[bucket] = url;
                return url;
            }
            
            return null,err;
        }
        
            
        upload = function(bucket,filePath,fileName,override){ 
            if(fileName == null){
                fileName = ..io.splitpath(filePath).file
            } 
            
            var uploadUrl = this.getUploadUrl(bucket);
            
            this.sendMultipartForm( {
                key = fileName;
                token = this.getUploadToken(bucket,fileName,override);
                    file = "@"++filePath;
                }
            )  
            
            return this.api(uploadUrl).post()
        }   
    }
}



2021-04-11   #4

回复#3 @jacen_he :

多谢

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
苏扬博客:苏扬博客
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
本 站 主 站:Stm32cube中文网
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
aardio在线手册Aardio在线手册

赞助商:才仁机械
下载站:非凡软件站
Loading...