需求为本地选择视频文件,然后上传到腾讯COS
工具:AndroidStudio、HBuilder X、XCode
Android
1.uniapp中处理
(1)主要使用了plugin.js与原生交互,common中新建plugin.js类,调用java方法为uploadFileCOS,源码如下:
! function(root, factory) {
if (typeof exports == 'object' && typeof module != 'undefined') {
module.exports = factory()
} else if (typeof define == 'function' && define.amd) {
define(factory)
} else {
document.addEventListener('plusready', function(){
// 修改此处为插件命名 注释---1
var moduleName = 'elitetyc';
root.plus[moduleName] = factory()
},false);
}
}(this, function() {
var _BARCODE = 'elitetyc';
var plugintest = {
/**
* 上传文件到COS
* @param string pathstr 本地文件绝对路径
* @param string cosPath 在cos中路径,带后缀
* @param successCallback 成功回调
* @param errorCallback 失败回调
*/
uploadFileCOS: function(pathstr,cosPath,successCallback, errorCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
fail = typeof errorCallback !== 'function' ? null : function(code) {
errorCallback(code);
};
var callbackID = plus.bridge.callbackId(success, fail);
return plus.bridge.exec(_BARCODE, "uploadFileCOS", [callbackID,pathstr,cosPath]);
}
};
return plugintest;
});
(2)vue中逻辑处理
/**
* 选择视频
*/
chooseVideo: function() {
var _this = this
_this.tempFilePath = null;//本地视频路径
uni.chooseVideo({
count: 1,
maxDuration: _this.time,
compressed: false,
success: function(res) {
if (res.duration > _this.time+1) {
return _main.showError('视频不能大于' + _this.time +'秒,请重新选择!');
}
var p = plus.io.convertLocalFileSystemURL(_this.tempFilePath);//将本地视频路径转化为绝对路径
return _this.uploadFileCOS(p);//执行上传
}
});
},
/* 上传文件 */
uploadFileCOS(path){
//srcPath 这里定义固定的mp4,正常线上需要根据选择视频类型将其他格式转化为mp4,否则上传后会被强制改后缀,导致解析不了
var srcPath = '123.mp4';
//this.plugins引用的plugin.js
this.plugins.uploadFileCOS(
path,
srcPath,
function(result) {
_this.show = false
if (result == 'ok') {
//上传成功,做后续处理
return _this.addsmallvideo(cospath);
}
_main.showError('上传失败,网络不稳定');
},
function(result) {
_this.show = false
_main.showError('上传失败');
}
);
},
至此js端处理完毕
2.java处理上传
用到腾讯云对象储存Android SDK,文档链接:https://cloud.tencent.com/document/product/436/12159
(1)下载uniapp官方提供的原生打包工程,使用HBuilder-Hello
(2)接入sdk,build.gradle 文件中添加如下依赖
dependencies {
...
// 增加这行
implementation 'com.tencent.qcloud:cosxml:5.5.5'
}
(3)初始化sdk获取永久密钥,新建类MySessionCredentialProvider.java,源码如下
package com.cos;
import android.content.Context;
import com.tencent.cos.xml.CosXmlService;
import com.tencent.cos.xml.CosXmlServiceConfig;
import com.tencent.qcloud.core.auth.QCloudCredentialProvider;
import com.tencent.qcloud.core.auth.ShortTimeCredentialProvider;
public class MySessionCredentialProvider{
public CosXmlService QCloudLifecycleCredentials(Context context){
String secretId = "AKIDDEzWoqX8PQEm59SVdhW4MPCiz4tRLDG9"; //永久密钥 secretId
String secretKey = "QaYHl12oLdiY9VcVAaliQt7AzZu0rURS"; //永久密钥 secretKey
// 存储桶所在地域简称,例如广州地区是 ap-guangzhou
String region = "ap-beijing-1";
// keyDuration 为请求中的密钥有效期,单位为秒
QCloudCredentialProvider myCredentialProvider =
new ShortTimeCredentialProvider(secretId, secretKey, 300);
// 创建 CosXmlServiceConfig 对象,根据需要修改默认的配置参数
CosXmlServiceConfig serviceConfig = new CosXmlServiceConfig.Builder()
.setRegion(region)
.isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求
.builder();
// 初始化 COS Service,获取实例
return new CosXmlService(context,
serviceConfig, myCredentialProvider);
}
}
(4)新建ElitetycPluginTest.java类,用于上传文件、与层交互,源码如下
package com.daliao.daliaovideo;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
import org.json.JSONArray;
import android.util.Log;
import com.cos.MySessionCredentialProvider;
import com.tencent.cos.xml.CosXmlService;
import com.tencent.cos.xml.exception.CosXmlClientException;
import com.tencent.cos.xml.exception.CosXmlServiceException;
import com.tencent.cos.xml.listener.CosXmlProgressListener;
import com.tencent.cos.xml.listener.CosXmlResultListener;
import com.tencent.cos.xml.model.CosXmlRequest;
import com.tencent.cos.xml.model.CosXmlResult;
import com.tencent.cos.xml.transfer.COSXMLUploadTask;
import com.tencent.cos.xml.transfer.TransferConfig;
import com.tencent.cos.xml.transfer.TransferManager;
import com.tencent.cos.xml.transfer.TransferState;
import com.tencent.cos.xml.transfer.TransferStateListener;
public class ElitetycPluginTest extends StandardFeature {
String TAG = "VideoApi";
/* 上传到cos srart*/
/**
* 定义一个方法 将自己的名字加上数字进行返回
*
* @param pWebview
* @param array
*/
public void uploadFileCOS(IWebview pWebview, JSONArray array) {
// 获取回调ID
String CallBackID = array.optString(0);
Log.e(TAG, "cosPath--"+array.optString(2));
/* 初始化sdk */
CosXmlService cosXmlService = new MySessionCredentialProvider().QCloudLifecycleCredentials(pWebview.getContext());
TransferConfig transferConfig = new TransferConfig.Builder().build();
TransferManager transferManager = new TransferManager(cosXmlService,
transferConfig);
String bucket = "zb-1253570875"; //存储桶,格式:BucketName-APPID
String cosPath = array.optString(2); //对象在存储桶中的位置标识符,即称对象键
String srcPath = array.optString(1);; //本地文件的绝对路径
String uploadId = null;
// 上传文件
COSXMLUploadTask cosxmlUploadTask = transferManager.upload(bucket, cosPath,
srcPath, uploadId);
//设置上传进度回调
cosxmlUploadTask.setCosXmlProgressListener(new CosXmlProgressListener() {
@Override
public void onProgress(long complete, long target) {
// todo Do something to update progress...
Log.e(TAG, "onProgress--"+target);
}
});
//设置返回结果回调
cosxmlUploadTask.setCosXmlResultListener(new CosXmlResultListener() {
@Override
public void onSuccess(CosXmlRequest request, CosXmlResult result) {
COSXMLUploadTask.COSXMLUploadTaskResult cOSXMLUploadTaskResult =
(COSXMLUploadTask.COSXMLUploadTaskResult) result;
Log.e(TAG, "setCosXmlResultListener--成功");
String _srcPath = "ok";
JSUtil.execCallback(pWebview, CallBackID, _srcPath, JSUtil.OK, false);
}
@Override
public void onFail(CosXmlRequest request,
CosXmlClientException clientException,
CosXmlServiceException serviceException) {
if (clientException != null) {
clientException.printStackTrace();
} else {
serviceException.printStackTrace();
}
Log.e(TAG, "setCosXmlResultListener--失败");
String _srcPath = "no";
JSUtil.execCallback(pWebview, CallBackID, _srcPath, JSUtil.OK, false);
}
});
//设置任务状态回调, 可以查看任务过程
cosxmlUploadTask.setTransferStateListener(new TransferStateListener() {
@Override
public void onStateChanged(TransferState state) {
// todo notify transfer state
}
});
}
}
(5)dcloud_properties.xml中需要添加自己的插件扩展
<feature name="elitetyc" value="com.daliao.daliaovideo.ElitetycPluginTest"/>
至此上传结束,如需上传进度等参数自行回调