autojs使用阿里云oss上传文件

621 阅读3分钟

牙叔教程 简单易懂

autojs版本

8.8.20-0

访问阿里云oss官网

使用步骤

  1. 开通oss
  2. 创建bucket
  3. 上传文件

上传文件

网页可以直接上传文件, 显然写脚本不会用网页上传文件, 我们自然要用api来上传文件

身份识别

如果要用api来上传文件, 那么必然要有一个凭证, 你有什么资格上传文件, 这就涉及到了权限问题, ​

凭证一般指的是秘钥, 你不可能把你的秘钥给别人用, 对吧?

万一别人拿你的秘钥霍霍你的oss咋办? 万一删库跑路呢?

秘钥

阿里云oss有一个访问控制RAM, 我们可以创建一个RAM用户, 该用户可以被授予颗粒度非常细的权限, 比如我们只给他上传文件的权限, 不给他下载文件的权限, 也不给他删除文件的权限 ​

我们只给ram用户最小的权限, 同时ram有自己的秘钥, 一定程度上, 这个秘钥可以被公开, 当然, 不公开最好 ​

如果我们删除秘钥, 并且oss的文件设置为私有, 那么别人是下载不了我们的文件的, 只有拥有秘钥, 并且有下载权限, 才能下载文件

创建RAM用户

  1. 前往控制台

1前往控制台.jpg

  1. 点击创建用户

2创建用户.jpg

  1. 填写名称, 选择api访问

3填写用户信息.jpg

  1. 记录ram用户的秘钥

4获取aksk.jpg

  1. 返回用户页, 就能看见我们创建好的ram用户了

5用户创建完成.jpg

RAM权限

权限规则, 看懂之后, 还算简单, 同时官方提供了RAM策略编辑器, 这个策略我理解就是指的权限,

比如我们给RAM用户, 对bucket名字为autojs-study, 该bucket下的files文件夹, 设置允许上传文件的权限, 那么他就只能上传文件到files文件夹

(enablePath最好打勾) ram策略编辑器.jpg

授权策略例子

该策略是: 允许上传文件到名字为autojs-study的文件夹下的files文件夹

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:PutObject"
      ],
      "Resource": [
        "acs:oss:*:*:autojs-study/files/*"
      ],
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects"
      ],
      "Resource": [
        "acs:oss:*:*:autojs-study"
      ],
      "Condition": {
        "StringLike": {
          "oss:Prefix": [
            "",
            "files/*"
          ]
        },
        "StringEquals": {
          "oss:Delimiter": "/"
        }
      }
    }
  ]
}

新建自定义权限策略

  1. 点击创建权限策略

01创建权限策略.jpg

  1. 填写策略名字和策略内容, 内容就是上面刚用策略编辑器生成的策略

02填写策略1.jpg

  1. 查看创建的策略

03查看创建的策略.jpg

给RAM用户设置策略

  1. 点击添加权限

001点击添加权限.jpg

  1. 添加自定义权限

002选择权限.jpg

  1. 点击用户名

003点击用户名.jpg

  1. 此处可以看见添加的策略

004查看设置的权限.jpg

使用api方式上传文件

let dexPath = files.path("/storage/emulated/0/oss_classes_merge2.dex");
// 这个dex文件是从oss的androidSDK中提取出来的, 
// 只能使用sd卡的路径, 其他路径, 比如apk的内部路径会报错
// let dexPath = files.path("./oss_classes_merge2.dex");
runtime.loadDex(dexPath);
importClass(com.alibaba.sdk.android.oss.ClientConfiguration);
importClass(com.alibaba.sdk.android.oss.ClientException);
importClass(com.alibaba.sdk.android.oss.OSS);
importClass(com.alibaba.sdk.android.oss.OSSClient);
importClass(com.alibaba.sdk.android.oss.ServiceException);
importClass(com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider);
importClass(com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider);
importClass(com.alibaba.sdk.android.oss.model.PutObjectRequest);
importClass(com.alibaba.sdk.android.oss.model.PutObjectResult);

let endpoint = "oss-cn-beijing.aliyuncs.com";
let ak = "LTAI5tNodPwPEMbPc1CnSBVb";
let sk = "v8uDRNAeWHfMULTtpTDuNTkWeJR33S";
let bucketName = "autojs-study";
let dirName = "files";
let fileName = "testFile";

let credentialProvider = new OSSStsTokenCredentialProvider(ak, sk, "");
log(credentialProvider);

let conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
let oss = new OSSClient(context, endpoint, credentialProvider, conf);
let filepath = files.path("/storage/emulated/0/脚本/autojs-ali-oss/key.json");
log(filepath);
log(files.exists(filepath));
let put = new PutObjectRequest(bucketName, dirName + "/" + fileName, filepath);
putResult = oss.putObject(put);

log("PutObject", "UploadSuccess");
log("ETag", putResult.getETag());
log("RequestId", putResult.getRequestId());

修改策略内容

0001修改策略内容.jpg

声明

部分内容来自网络 本教程仅用于学习, 禁止用于其他用途