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掃碼加群, 小夥伴們都在等著你哦!
關注我的公眾號, 每天都能一起玩耍哦!