CosService.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package com.fxy.common;
  2. import android.content.Context;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import com.elvishew.xlog.XLog;
  6. import com.fxy.BuildConfig;
  7. import com.fxy.constant.SPCache;
  8. import com.fxy.net.Urls;
  9. import com.tencent.cos.xml.CosXmlServiceConfig;
  10. import com.tencent.cos.xml.CosXmlSimpleService;
  11. import com.tencent.cos.xml.exception.CosXmlClientException;
  12. import com.tencent.cos.xml.exception.CosXmlServiceException;
  13. import com.tencent.cos.xml.listener.CosXmlProgressListener;
  14. import com.tencent.cos.xml.listener.CosXmlResultListener;
  15. import com.tencent.cos.xml.model.CosXmlRequest;
  16. import com.tencent.cos.xml.model.CosXmlResult;
  17. import com.tencent.cos.xml.transfer.COSXMLUploadTask;
  18. import com.tencent.cos.xml.transfer.TransferConfig;
  19. import com.tencent.cos.xml.transfer.TransferManager;
  20. import com.tencent.cos.xml.transfer.TransferState;
  21. import com.tencent.cos.xml.transfer.TransferStateListener;
  22. import com.tencent.qcloud.core.auth.QCloudCredentialProvider;
  23. import com.tencent.qcloud.core.auth.SessionCredentialProvider;
  24. import com.tencent.qcloud.core.http.HttpRequest;
  25. import java.net.MalformedURLException;
  26. import java.net.URL;
  27. public class CosService {
  28. private Context mContext;
  29. private String bucketName = "";
  30. private String path_prefix = "";
  31. // 存储桶所在地域简称,例如广州地区是 ap-guangzhou
  32. private String regionId = "";
  33. // 创建 CosXmlServiceConfig 对象,根据需要修改默认的配置参数
  34. private CosXmlServiceConfig serviceConfig ;
  35. // 初始化 COS Service,获取实例
  36. private CosXmlSimpleService cosXmlService ;
  37. private COSXMLUploadTask cosxmlUploadTask;
  38. public CosService(Context context,String prefix){
  39. mContext = context;
  40. SPCache spCache = SPCache.getInstance(mContext);
  41. String cosHost = spCache.getResourceHost();
  42. String resource_prefix = spCache.getResourcePrefix();
  43. //上传路径确保前缀
  44. if (!resource_prefix.contains(resource_prefix)){
  45. prefix = resource_prefix+prefix;
  46. }
  47. //zj-1304592070.cos.ap-singapore.myqcloud.com
  48. bucketName = spCache.getResourceBucket();
  49. regionId = spCache.getResourceRegion();
  50. path_prefix = prefix;
  51. creationCos();
  52. }
  53. public CosXmlSimpleService creationCos(){
  54. URL url = null; // 后台授权服务的 url 地址
  55. try {
  56. url = new URL(Urls.getServiceAddress(mContext)+ Urls.FMS_UPLOAD_SIGN);
  57. } catch (MalformedURLException e) {
  58. e.printStackTrace();
  59. }
  60. QCloudCredentialProvider credentialProvider = new SessionCredentialProvider(new HttpRequest.Builder<String>()
  61. .url(url)
  62. .method("GET")
  63. .addHeader("warehouse-id",SPCache.getInstance(mContext).getWareHouseId())
  64. .addHeader("version","999999")
  65. .addHeader("token",SPCache.getInstance(mContext).getToken())
  66. .encodedQuery("path_prefix",path_prefix+"*")
  67. .build());
  68. serviceConfig = new CosXmlServiceConfig.Builder()
  69. .setRegion(regionId)
  70. .isHttps(true) // 使用 HTTPS 请求, 默认为 HTTP 请求
  71. .builder();
  72. cosXmlService = new CosXmlSimpleService(mContext,serviceConfig, credentialProvider);
  73. return cosXmlService;
  74. }
  75. public void cosUpload(String filePath, String uploadName , int num, Handler handler){
  76. new CosThread(filePath, uploadName , num,handler).start();
  77. }
  78. //取消上传
  79. public void taskCancel(){
  80. if (cosxmlUploadTask!=null){
  81. boolean pauseSuccess = cosxmlUploadTask.pauseSafely();
  82. if (pauseSuccess){
  83. cosxmlUploadTask.cancel();
  84. }
  85. }
  86. }
  87. //腾讯云cos上传
  88. class CosThread extends Thread {
  89. private String urlPath = "";
  90. private String fileName = "";
  91. private int current = 0;
  92. private Handler uploadHandler ;
  93. // 若存在初始化分块上传的 UploadId,则赋值对应的 uploadId 值用于续传;否则,赋值 null
  94. private String uploadId = null;
  95. /**
  96. *
  97. * @param filePath 本地文件路径
  98. * @param uploadName 上传后文件名
  99. * @param num 序号
  100. */
  101. public CosThread(String filePath, String uploadName , int num, Handler handler) {
  102. urlPath = filePath;
  103. fileName = uploadName;
  104. current = num;
  105. uploadHandler = handler;
  106. }
  107. public void run() {
  108. // 初始化 TransferConfig,这里使用默认配置,如果需要定制,请参考 SDK 接口文档
  109. TransferConfig transferConfig = new TransferConfig.Builder().build();
  110. // 初始化 TransferManager
  111. TransferManager transferManager = new TransferManager(getCosXmlService(), transferConfig);
  112. String bucket = getBucketName(); //存储桶,格式:BucketName-APPID
  113. String cosPath = getCosPath()+fileName; //对象在存储桶中的位置标识符,即称对象键
  114. //String srcPath = new File(mContext.getCacheDir(), urlPath).toString(); //本地文件的绝对路径
  115. // 上传文件
  116. cosxmlUploadTask = transferManager.upload(bucket, cosPath,urlPath, uploadId);
  117. //设置上传进度回调
  118. cosxmlUploadTask.setCosXmlProgressListener(new CosXmlProgressListener() {
  119. @Override
  120. public void onProgress(long complete, long target) {
  121. // todo Do something to update progress...
  122. int progress = (int) ((double) complete / (double) target * 100);
  123. Message msg = new Message();
  124. msg.arg1 = progress;
  125. msg.what = 3;
  126. uploadHandler.sendMessage(msg);
  127. }
  128. });
  129. //设置返回结果回调
  130. cosxmlUploadTask.setCosXmlResultListener(new CosXmlResultListener() {
  131. @Override
  132. public void onSuccess(CosXmlRequest request, CosXmlResult result) {
  133. if (BuildConfig.DEBUG){
  134. XLog.e(result);
  135. }
  136. //COSXMLUploadTask.COSXMLUploadTaskResult cOSXMLUploadTaskResult = (COSXMLUploadTask.COSXMLUploadTaskResult) result;
  137. String[] accessUrlArr = result.accessUrl.split(".myqcloud.com");
  138. Message msg = new Message();
  139. msg.arg1 = current;
  140. msg.obj = accessUrlArr[1];
  141. msg.what = 2;
  142. uploadHandler.sendMessage(msg);
  143. }
  144. @Override
  145. public void onFail(CosXmlRequest request, CosXmlClientException clientException, CosXmlServiceException serviceException) {
  146. Message msg = new Message();
  147. msg.what = 1;
  148. if (clientException != null) {
  149. // 本地异常,如网络异常等。
  150. msg.obj = "网络异常,请稍后...";
  151. uploadHandler.sendMessage(msg);
  152. //clientException.printStackTrace();
  153. } else {
  154. msg.obj = "服务异常,请稍后...";
  155. uploadHandler.sendMessage(msg);
  156. //serviceException.printStackTrace();
  157. XLog.e("ErrorCode", serviceException.getErrorCode());
  158. XLog.e("RequestId", serviceException.getRequestId());
  159. XLog.e("tLocalizedMessage", serviceException.getLocalizedMessage());
  160. XLog.e("Message", serviceException.getMessage());
  161. }
  162. }
  163. });
  164. //设置任务状态回调, 可以查看任务过程
  165. cosxmlUploadTask.setTransferStateListener(new TransferStateListener() {
  166. @Override
  167. public void onStateChanged(TransferState state) {
  168. // todo notify transfer state
  169. if (BuildConfig.DEBUG){
  170. XLog.e(state);
  171. }
  172. Message msg = new Message();
  173. msg.arg1 = current;
  174. msg.obj = state;
  175. msg.what = 5;
  176. uploadHandler.sendMessage(msg);
  177. }
  178. });
  179. }
  180. }
  181. /**
  182. * 返回 cosXmlService
  183. * @return
  184. */
  185. public CosXmlSimpleService getCosXmlService(){
  186. return cosXmlService;
  187. }
  188. public String getBucketName(){
  189. return bucketName;
  190. }
  191. public String getCosPath(){
  192. return path_prefix;
  193. }
  194. }