首先在build.gradle(Module)中实现
implementation 'com.aliyun.dpa:oss-android-sdk:+'
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
然后在Manifest中加上
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
这些配置完后就可以使用Oss上传了
这里我封装了一个工具类,具体代码如下
(这里的ACCESS_ID和ACCESS_KEY千万不能泄露!!!!!)
import android.content.Context
import android.util.Log
import com.alibaba.sdk.android.oss.ClientConfiguration
import com.alibaba.sdk.android.oss.ClientException
import com.alibaba.sdk.android.oss.OSSClient
import com.alibaba.sdk.android.oss.ServiceException
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider
import com.alibaba.sdk.android.oss.model.PutObjectRequest
class OssUpload {
fun doUpload(context: Context,objectKey: String,uploadFilePath: String){
// ACCESS_ID,ACCESS_KEY是在阿里云申请的
//以下信息绝密,不可外泄!!!!!
val credentialProvider: OSSCredentialProvider = OSSPlainTextAKSKCredentialProvider(ACCESS_ID,ACCESS_KEY)
val conf = ClientConfiguration()
conf.connectionTimeout = 15 * 1000 // 连接超时,默认15秒
conf.socketTimeout = 15 * 1000 // socket超时,默认15秒
conf.maxConcurrentRequest = 8 // 最大并发请求数,默认5个
conf.maxErrorRetry = 2 // 失败后最大重试次数,默认2次
// OSS_ENDPOINT是一个OSS区域地址
var oss = OSSClient(context, "http://oss-cn-beijing.aliyuncs.com", credentialProvider, conf)
//Log.v("cx","---------2")
// 构造上传请求
val put = PutObjectRequest("bucket-ljh", objectKey, uploadFilePath)
try {
val putResult = oss.putObject(put)//进行文件上传
} catch (e: ClientException) {
// 本地异常如网络异常等
e.printStackTrace()
} catch (e: ServiceException) {
// 服务异常
Log.e("RequestId", e.requestId)
Log.e("ErrorCode", e.errorCode)
Log.e("HostId", e.hostId)
Log.e("RawMessage", e.rawMessage)
}
}
}
这个类是上传文件的类。一共就只有一个方法,即doUpload()。里面有三个参数。
第一个是上下文,一般如果在MainActivity调用就传this即可。
第二个参数是文件上传到Oss后,保存的名称。
第三个参数是文件在手机本地的路径。
比如我这里使用一下,就是
var ossUpload = OssUpload()
ossUpload.doUpload(this,"Eliminate_holidays/myImg.jpg",externalCacheDir.toString()+"/test.png")
这里,"Eliminate_holidays/myImg.jpg"
的意思是我的oss存储器上有个Eliminate_holidays文件夹,然后我把我的图片以myImg.jpg的名称(key)上传到oss中。然后这张图片保存的路径就是第三个参数。
这样我在oss存储器中创建了多个文件夹,用来保存不同类型的文件。
使用原理和刚刚那个例子一样。然后图片命名的时候一定要规范,知道是谁的照片。
然后图片就可以上传了。