autojs使用阿里云oss上传文件

牙叔教程 简单易懂javascript

autojs版本

8.8.20-0html

访问阿里云oss官网

使用步骤

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

上传文件

网页能够直接上传文件, 显然写脚本不会用网页上传文件, 咱们天然要用api来上传文件java

身份识别

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

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

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

秘钥

阿里云oss有一个访问控制RAM, 咱们能够建立一个RAM用户, 该用户能够被授予颗粒度很是细的权限, 好比咱们只给他上传文件的权限, 不给他下载文件的权限, 也不给他删除文件的权限 ​markdown

咱们只给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策略编辑器, 这个策略我理解就是指的权限,socket

好比咱们给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

声明

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