AS--›Gradle上传文件至七牛云

Gradle介绍

我并不打算在这里把所有的gradle知识都介绍一遍, 毕竟我不没有全部掌握. 而且百度爸爸更懂你. 这里简单介绍一下文章中需要用的相关知识.

变量的声明

使用关键字def可以声明变量

def name = "name"

也可以像java一样声明变量

String name = "name"

Gradle 使用的是 groovy语言编写. 而groovy支持动态类型, 所以声明变量的时候, 可以不指定类型. 编译器会自动识别类型.

需要注意的是: 如果我们在工程中使用gradle脚本(比如Android 工程, Java 工程), 变量是有作用域的.
通常用 def 声明的变量, 无法在 task 之间共享.

所以为了能够在多个task之间, 访问同一个变量.一般情况, 我都是用以下方法:

ext.name = "name"

这样声明的name,就可以在task之间互相访问.

ext工程(Project)中才有的属性. 具体可以查看:org.gradle.api.Project#getExtensions

函数的声明

函数的声明和java大致相同, 由于动态类型的加持, 所以可以不需要指定参数类型返回值类型

static def func(name, age){
	...
	函数体
	...
	return "name"
}

Task的使用

Gradle更强大的功能在于Task.
Gradle为我们提供了很多Task Type, 点击这里查看
不同的Task Type对应不同的功能, 并且提供了相当简洁的API调用, 可以很轻松完成相应的Task.

声明Task
声明Task, 和声明方法类似, 只不过def关键字, 换成了task关键字.

task test(){
	...
}

请注意:Gradle是有生命周期的概念, 在task执行之前, 都会有一个叫做配置阶段的东西.
配置阶段会把所有声明的task都配置一遍, 但是不会执行. 所以在配置阶段所有的变量,task参数都已经确定好了.
要修改他们, 只能在运行期, 动态设置.

Task的2个关键方法

test.doFirst{
	...
}
test.doLast{
	...
}

见名知意.
doFirst 会在task 执行前调用;可以用来真正执行耗时任务(比如网络请求), 或者动态修改task执行参数.
doLast 会在task 执行后调用;可以用来收集返回值, 或者task执行后的回调.


七牛云介绍

七牛云SDK 中, 有Java语言的版本, 所以想着直接用SDK进行请求操作.
这里就要介绍一下Gradle强大的Java环境支持.

Gradle中使用Java环境

其实在gradle文件中, 可以直接创建java环境的下的所有对象, 而不需要import类名.
但是, 当我们需要使用第三方SDK时, 怎么办呢?

这里已七牛云SDK为例, 介绍一下, 如何在gradle中使用第三方SDK的方法:

buildscript {
    //配置仓库地址, 用来下载jar包
    repositories {
        jcenter()
    }
    //需要引入的jar包,  (本人暂时没有测试本地jar的引入方式, 有试过的同学可以在评论区留言.)
    dependencies {
        classpath 'com.qiniu:qiniu-java-sdk:7.2.18'
    }
}

以上配置之后, 当前的gradle文件, 可以使用SDK相关类. 跨文件需要重新配置, 方可访问.

调用七牛云SDK,上传文件

所有源码如下:

import com.qiniu.*
import com.qiniu.storage.*
import com.qiniu.storage.model.*
import com.qiniu.util.*
import com.qiniu.http.*
import com.qiniu.common.*
import com.google.gson.*

/**
 * 请无视IDEA的爆红, 并不影响运行.
 *
 * 请不要随意导入其他包.
 * */

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.qiniu:qiniu-java-sdk:7.2.18'
        classpath "com.google.code.gson:gson:2.8.5"
    }
}

ext.qiniuConfig = [
        //必填
        "AccessKey"  : "",
        //必填
        "SecretKey"  : "",
        //必填, 请填写对应的七牛的Bucket
        "Bucket"     : "download",

        //必填, 可以是绝对路径, 也可以是相对于脚本所在的相对路径.
        "apkPath"    : "./ademo.apk",
        //必填, 七牛下载域名前缀, 需要'/'结尾, 例如 "http://download.qiniu.com/"
        "baseUrl"    : "",

        //变量. 用来保存上传成功后, APK的下载地址. 
        "downloadUrl": ""
]

task _qiniuUpload() {
    doFirst {
        if (qiniuConfig.apkPath == null) {
            throw IllegalStateException("请指定上传的文件")
        }

        def apkFile = file(qiniuConfig.apkPath)

        if (!apkFile.exists()) {
            throw IllegalStateException("需要上传的文件不存在:" + apkFile.getAbsolutePath())
        }

        //创建上传凭证, 这是必须的.
        def auth = Auth.create(qiniuConfig.AccessKey, qiniuConfig.SecretKey)

        def key = apkFile.name

        def putPolicy = new StringMap()
        putPolicy.put("returnBody", "{\"key\":\"" + key + "\", \"hash\":\"" + System.currentTimeMillis() + "\"}")
        def expireSeconds = 3600L
        String upToken = auth.uploadToken(qiniuConfig.Bucket, null, expireSeconds, putPolicy)

        println "七牛云上传凭证:" + upToken

        //UploadManager uploadManager = new UploadManager()
        //Auth auth = Auth.create(accessKey, secretKey)
        //String token = auth.uploadToken(bucketName)
        //Response r = upManager.put("hello world".getBytes(), "yourkey", token)


        def downloadUrl = qiniuConfig.baseUrl + key
        println "开始上传:" + apkFile.getAbsolutePath() + "->" + downloadUrl

        //上传本地文件
        def cfg = new Configuration(Zone.zone0())
        def uploadManager = new UploadManager(cfg)
        def response = uploadManager.put(apkFile, key, upToken)
        def putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class)

        qiniuConfig.downloadUrl = downloadUrl
        println "七牛云上传成功->" + qiniuConfig.downloadUrl
    }
}

执行: gradlew _qiniuUpload 就可以上传apkPath指定的本地文件


群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此快速加群

请使用QQ扫码加群, 小伙伴们都在等着你哦!

关注我的公众号, 每天都能一起玩耍哦!

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页