aardio 文档
aardio 范例: 对象存储
import win;
import console.int;
import web.rest.qiniu; // 管理端库
import web.rest.client; // 通用客户端库
import fsys;
/*
要注意七牛 kodo 对象存储分为两个角色。
执有管理密钥的 web.rest.qiniu 对象 —— 属于管理角色。
执有临时上传下载密钥的 web.rest.client 对象 —— 属于传输角色
如果用 web.view 做界面,则可以由网页 JavaScript 充当传输角色,
只要把生成的临时上传下载链接与 token 扔给前端即可。
如果是 HTTP 服务端与客户端,则用执有管理密钥的 web.rest.qiniu 写服务端代码,
生成的临时上传下载链接与 token 扔给浏览器前端即可。
一定要将这两个不同职责的角色分清楚。
*/
//配置
var config = {
accessKey = "你的AccessKey";
secretKey = "你的SecretKey";
bucket = "你的Bucket名称";
domain = "http://你的域名.bkt.clouddn.com"; // 必填,下载用
// 上传节点:华东 up.qiniup.com, 华北 up-z1.qiniup.com 等
uploadUrl = "http://up.qiniup.com";
}
console.assert(config.accessKey != "你的AccessKey","请配置 AccessKey");
// ==========================================
// 角色一:服务端 / 管理员 (Manager)
// 职责:持有密钥,负责发号施令、生成凭证、管理文件
// ==========================================
console.log("【角色:管理端】正在初始化...");
var qiniuMgr = web.rest.qiniu(config);
// 1. 生成 Upload Token
var uploadToken = qiniuMgr.getUploadToken({
scope = config.bucket;
// 强制七牛返回 JSON 格式,包含 key 和 hash
returnBody = '{"key":"$(key)","hash":"$(etag)","fsize":$(fsize)}';
});
// 准备一个测试文件
var localFile = "/qiniu_test_client.txt";
string.save(localFile, "Test file from aardio client " + tostring(time.now()));
// ==========================================
// 角色二:客户端 / 前端 (Client)
// 职责:不接触 SecretKey,只拿 Token 干活
// ==========================================
console.log("【角色:客户端】准备上传...");
var uploadClient = web.rest.client();
var uploadApi = uploadClient.api(config.uploadUrl);
// 引入控制台进度条组件
import console.progress;
var bar = console.progress();
var result, err = uploadApi.sendMultipartForm({
token = uploadToken;
key = "client/test.txt";
file = "@" + localFile;//上传文件路径第一个字符必须是 "@"
},function(sendData,sendSize,contentLength,remainSize){
// 使用进度条组件显示
var percent = math.round((sendSize/contentLength)*100);
bar.setProgress(percent, string.format("上传中... %d%%", percent));
});
bar.reset(); // 上传完成后重置进度条
console.log(); // 换行
console.status(result,"上传",,,err);
// ==========================================
// 角色一:服务端 / 管理员 (Manager)
// 职责:验证上传结果,生成下载链接
// ==========================================
console.log("------------------------------------------");
console.log("【角色:管理端】验证文件信息 (Stat)...");
// 管理 API 地址 (华东: rs.qiniu.com)
var rsApi = qiniuMgr.api("http://rs.qiniu.com");
// 构造 EncodedEntryURI (Bucket:Key 的 Base64)
var entryId = qiniuMgr.entry(config.bucket, "client/test.txt");
// 获取文件信息: GET /stat/<EncodedEntryURI>
// aardio rest 库会自动将 [] 内的参数拼接到 URL 路径中
var statInfo, err = rsApi.stat[entryId].get();
if(statInfo){
console.log("【角色:管理端】文件存在,Hash:", statInfo.hash);
// 生成私有下载链接(即使是公开 Bucket,用私有链接也是安全的)
var downloadUrl = qiniuMgr.getPrivateDownloadUrl(config.domain, "client/test.txt", 300);
console.log("【角色:管理端】签发下载链接(5分钟有效):", downloadUrl);
// ==========================================
// 角色二:客户端 / 前端 (Client)
// 职责:使用链接下载
// ==========================================
console.log("------------------------------------------");
console.log("【角色:客户端】开始下载...");
var downClient = web.rest.client();
// 下载文件到本地
var savePath = "/download_test.txt";
var ok, err = downClient.receiveFile(savePath).get(downloadUrl);
if(ok){
console.success("【角色:客户端】下载成功,内容预览:");
console.log(string.load(savePath));
io.remove(savePath); // 清理下载文件
} else {
console.error("【角色:客户端】下载失败", err);
}
// ==========================================
// 角色一:服务端 / 管理员 (Manager)
// 职责:测试完成,清理云端文件
// ==========================================
console.log("------------------------------------------");
console.log("【角色:管理端】清理测试文件...");
console.log("------------------------------------------");
console.log("【角色:管理端】清理测试文件...");
// 写为 ["delete"] 避免被识别为 HTTP method
var _, err = rsApi["delete"][entryId].post();//此 API 调用成功无返回值
if(qiniuMgr.lastStatusCode==200){
console.success("【角色:管理端】删除成功。");
} else {
console.error("删除失败", err);
}
} else {
console.error("【角色:管理端】未找到文件", err);
}
// 清理本地上传用的临时文件
io.remove(localFile);
console.pause();
Markdown 格式