1. 程式人生 > >AS--›Gradle上傳檔案至七牛雲

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"     : "download",

        //需要上傳的APK路徑
        "apkPath"    : "./ademo.apk",
        //下載域名字首, 需要'/'結尾
        "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掃碼加群, 小夥伴們都在等著你哦!

關注我的公眾號, 每天都能一起玩耍哦!