配置就不说了,给出关键代码
需求
我的上传文件是上传视频
一、初始化OSS
override fun setAuthenResultData(data: BaseResponse<UploadCourseAuthBean>) {
//LogUtil.json("Acheng", data.data.toString())
//OSSCredentialProvider credentialProvider;
var credentialProvider: OSSCredentialProvider
//使用自己的获取STSToken的类
credentialProvider = OSSStsTokenCredentialProvider(data.data?.AccessKeyId, data.data?.AccessKeySecret, data.data?.SecurityToken)
val conf = ClientConfiguration()
conf.connectionTimeout = 15 * 1000 // 连接超时,默认15秒
conf.socketTimeout = 15 * 1000 // socket超时,默认15秒
conf.maxConcurrentRequest = 5 // 最大并发请求书,默认5个
conf.maxErrorRetry = 2 // 失败后最大重试次数,默认2次
mOss = OSSClient(applicationContext, endpoint, credentialProvider, conf)
}
endpoint:也是接口返回的
二、onActivityResult接收选择了的视频
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) return
when (requestCode) {
PictureConfig.CHOOSE_REQUEST -> {
if (!PictureSelector.obtainMultipleResult(data).isNullOrEmpty()){
videoURL = PictureSelector.obtainMultipleResult(data)[0].path
ViewUtils.visibility(dct_sc_course,false)
ViewUtils.visibility(cl_select_video_info,true)
tv_sc_video_title.text = UtilHelper.getStrFileName(videoURL)
//选择完视频就上传
var fileName = videoURL!!.substring(videoURL!!.lastIndexOf("."))
var folderName = UtilHelper.getCurrentDate3()
var currentTime = System.currentTimeMillis()
var finalName = "${SPUtils.getUid()}_${currentTime}${fileName}"
asyncPutImage(bucketName, "${folderName}/$finalName", "$videoURL")
}
}
关键是asyncPutImage方法,第一个参数bucketName是接口返回的配置信息,第二个是上传上去的文件名,第三个是文件路径
3、关键上传视频方法
private fun asyncPutImage(mBucket: String, `object`: String, localFile: String) {
val upload_start = System.currentTimeMillis()
if (`object` == "") {
return
}
val file = File(localFile)
if (!file.exists()) {
return
}
// 构造上传请求
val put = PutObjectRequest(mBucket, `object`, localFile)
put.crC64 = OSSRequest.CRC64Config.YES
if (mCallbackAddress != null) { // 传入对应的上传回调参数,这里默认使用OSS提供的公共测试回调服务器地址
put.callbackParam = object : HashMap<String?, String?>() {
init {
put("callbackUrl", mCallbackAddress)
//callbackBody可以自定义传入的信息
put("callbackBody", "filename=${`object`}")
}
}
}
// 异步上传时可以设置进度回调
put.progressCallback = OSSProgressCallback { request, currentSize, totalSize ->
var progress = (100 * currentSize / totalSize).toInt()
//更新上传中进度条
updateProgress(progress)
}
task = mOss!!.asyncPutObject(put, object : OSSCompletedCallback<PutObjectRequest, PutObjectResult> {
override fun onSuccess(request: PutObjectRequest, result: PutObjectResult) {
LogUtil.json("Acheng", "上传结果" + result.serverCallbackReturnBody)
val jsonObject = JSONObject(result.serverCallbackReturnBody)
var resultUrl = jsonObject.getString("body")
uploadVideo = resultUrl.replace("filename=", videoHost)
LogUtil.json("Acheng", uploadVideo)
//上传完成,关闭上传中进度条
val mes = handler.obtainMessage(2, null)
mes.sendToTarget()
val upload_end = System.currentTimeMillis()
OSSLog.logDebug("upload cost: " + (upload_end - upload_start) / 1000f)
}
override fun onFailure(request: PutObjectRequest, clientExcepion: ClientException, serviceException: ServiceException) {
var info = ""
// 请求异常
if (clientExcepion != null) { // 本地异常如网络异常等
clientExcepion.printStackTrace()
info = clientExcepion.toString()
Log.d("Acheng", "本地异常如网络异常等$info")
}
if (serviceException != null) { // 服务异常
info = serviceException.toString()
Log.d("Acheng", "服务异常$info")
}
}
})
}
上传完得到的uploadVideo为了后面传给app服务器,以后服务器去这个地址就能访问出视频文件
至此OSS上传文件就完成,上面有些方法,变量没有的,可以注释掉。
有问题的请私信,或者评论
网友评论