OssService.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package com.fxy.common;
  2. import android.content.Context;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import android.widget.Toast;
  6. import com.alibaba.sdk.android.oss.ClientConfiguration;
  7. import com.alibaba.sdk.android.oss.ClientException;
  8. import com.alibaba.sdk.android.oss.OSS;
  9. import com.alibaba.sdk.android.oss.OSSClient;
  10. import com.alibaba.sdk.android.oss.ServiceException;
  11. import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
  12. import com.alibaba.sdk.android.oss.callback.OSSProgressCallback;
  13. import com.alibaba.sdk.android.oss.common.OSSConstants;
  14. import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
  15. import com.alibaba.sdk.android.oss.common.auth.OSSFederationCredentialProvider;
  16. import com.alibaba.sdk.android.oss.common.auth.OSSFederationToken;
  17. import com.alibaba.sdk.android.oss.common.utils.IOUtils;
  18. import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;
  19. import com.alibaba.sdk.android.oss.model.PutObjectRequest;
  20. import com.alibaba.sdk.android.oss.model.PutObjectResult;
  21. import com.elvishew.xlog.XLog;
  22. import com.fxy.baselibrary.util.RxTimeTool;
  23. import com.fxy.BuildConfig;
  24. import com.fxy.constant.SPCache;
  25. import com.fxy.net.Urls;
  26. import com.fxy.putIn.PutinPhotosMainActivity;
  27. import com.fxy.utils.UploadUtils;
  28. import org.json.JSONObject;
  29. import java.io.InputStream;
  30. import java.net.HttpURLConnection;
  31. import java.net.URL;
  32. import java.util.HashMap;
  33. public class OssService {
  34. private Context mContext;
  35. private String endpoint = ""; //上传节点 比如:http://oss-cn-shenzhen.aliyuncs.com
  36. private String bucketName = "fhdr"; // bucket值
  37. private String regionId = "cn-shenzhen"; //地区 比如:cn-shenzhen
  38. private String filePath = "fxy/";
  39. protected OSS oss ;
  40. protected String ossHost="";
  41. OSSAsyncTask taskId = null;
  42. public String getBucketName(){
  43. return bucketName;
  44. }
  45. public String getFilePath(){
  46. return filePath;
  47. }
  48. public void setFilePath(String filePath){
  49. this.filePath = filePath;
  50. }
  51. public String getOssHost(){
  52. return ossHost;
  53. }
  54. public OSS getOSS(){
  55. return oss;
  56. }
  57. public OssService(Context context, String filePath){
  58. mContext = context;
  59. initData();
  60. this.filePath = filePath;
  61. creationOss();
  62. }
  63. //创建 OSS
  64. public OSS creationOss(){
  65. // 在移动端建议使用STS的方式初始化OSSClient。
  66. String stsServer = Urls.getServiceAddress(mContext)+ Urls.FMS_UPLOAD_SIGN;
  67. // 推荐使用OSSAuthCredentialsProvider。token过期可以及时更新。
  68. OSSCredentialProvider credentialProvider = new OSSFederationCredentialProvider() {
  69. @Override
  70. public OSSFederationToken getFederationToken() {
  71. try {
  72. URL stsUrl = new URL(Urls.getServiceAddress(mContext)+ Urls.FMS_UPLOAD_SIGN);
  73. HttpURLConnection conn = (HttpURLConnection) stsUrl.openConnection();
  74. conn.setRequestProperty("warehouse-id", SPCache.getInstance(mContext).getWareHouseId());
  75. conn.setRequestProperty("version", "999999");
  76. conn.setRequestProperty("token", SPCache.getInstance(mContext).getToken());
  77. InputStream input = conn.getInputStream();
  78. String jsonText = IOUtils.readStreamAsString(input, OSSConstants.DEFAULT_CHARSET_NAME);
  79. JSONObject response = new JSONObject(jsonText);
  80. if (response.getInt("code")==1){
  81. JSONObject jsonObjs = response.getJSONObject("data");
  82. String ak = jsonObjs.getString("AccessKeyId");
  83. String sk = jsonObjs.getString("AccessKeySecret");
  84. String token = jsonObjs.getString("SecurityToken");
  85. String expiration = jsonObjs.getString("Expiration");
  86. SPCache spCache = SPCache.getInstance(mContext);
  87. if (jsonObjs.has("resource_region") && !spCache.getResourceRegion().equals(jsonObjs.getString("resource_region")) ||
  88. !spCache.getResourceBucket().equals(jsonObjs.getString("resource_bucket"))||
  89. !spCache.getResourcePrefix().equals(jsonObjs.getString("resource_prefix"))){
  90. spCache.setResourcePrefix(jsonObjs.getString("resource_prefix"));
  91. spCache.setResourceRegion(jsonObjs.getString("resource_region"));
  92. spCache.setResourceBucket(jsonObjs.getString("resource_bucket"));
  93. initData();
  94. }
  95. return new OSSFederationToken(ak, sk, token, expiration);
  96. }
  97. } catch (Exception e) {
  98. e.printStackTrace();
  99. }
  100. return null;
  101. }
  102. };
  103. // 在移动端建议使用STS的方式初始化OSSClient。
  104. //OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, "");
  105. ClientConfiguration conf = new ClientConfiguration();
  106. conf.setConnectionTimeout(240 * 1000); // 连接超时,默认15秒。
  107. conf.setSocketTimeout(240 * 1000); // socket超时,默认15秒。
  108. conf.setMaxConcurrentRequest(10); // 最大并发请求书,默认5个。
  109. conf.setMaxErrorRetry(3); // 失败后最大重试次数,默认2次。
  110. oss = new OSSClient(mContext, endpoint, credentialProvider, conf);
  111. //开始日志
  112. //OSSLog.enableLog();
  113. return oss;
  114. }
  115. //初始化oss数据以及切换不同的oss账号
  116. private void initData(){
  117. SPCache spCache = SPCache.getInstance(mContext);
  118. ossHost = spCache.getResourceHost();
  119. filePath = spCache.getResourcePrefix()+"/android/";
  120. //匹配资源
  121. bucketName = spCache.getResourceBucket();
  122. regionId = spCache.getResourceRegion();
  123. if (!regionId.isEmpty()){
  124. endpoint = "https://oss-"+regionId+".aliyuncs.com";
  125. }
  126. if (regionId.isEmpty()){
  127. Toast.makeText(mContext, "资源路径异常", Toast.LENGTH_SHORT).show();
  128. }
  129. }
  130. public void ossUpload(String filePath, String uploadName , int num, Handler handler){
  131. ossThread thread = new ossThread(filePath, uploadName , num,handler);
  132. thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
  133. public void uncaughtException(Thread t, Throwable e) {
  134. // 在这里处理线程抛出的异常,并使用传递的参数进行操作
  135. XLog.e("oss上传出现异常",e.getMessage());
  136. UploadUtils.delUploadTime(mContext);
  137. }
  138. });
  139. thread.start();
  140. UploadUtils.setUploadTime(mContext);
  141. //new ossThread(filePath, uploadName , num,handler).start();
  142. // task.cancel(); // 可以取消任务
  143. // task.waitUntilFinished(); // 可以等待直到任务完成
  144. }
  145. public void ossUpload(String filePath, String uploadName , int num, Handler handler,String uploadPath){
  146. this.filePath = uploadPath;
  147. ossUpload(filePath,uploadName,num,handler);
  148. }
  149. //取消上传
  150. public void taskCancel(){
  151. if (taskId!=null && !taskId.isCanceled()){
  152. taskId.cancel();
  153. }
  154. }
  155. //阿里云oss上传
  156. class ossThread extends Thread {
  157. private String urlPath = "";
  158. private String objectKey = "";
  159. private int current = 0;
  160. private Handler uploadHandler ;
  161. public ossThread(String filePath, String fileName ,int num,Handler handler) {
  162. urlPath = filePath;
  163. objectKey = fileName;
  164. current = num;
  165. uploadHandler = handler;
  166. }
  167. public void run() {
  168. // 下面3个参数依次为bucket名,ObjectKey名,上传文件路径
  169. final PutObjectRequest put = new PutObjectRequest(getBucketName(), getFilePath()+objectKey, urlPath);
  170. // put.setCallbackParam(new HashMap<String, String>() {
  171. // {
  172. // put("callbackUrl", "http://oss-demo.aliyuncs.com:23450");
  173. // put("callbackHost", "yourCallbackHost");
  174. // put("callbackBodyType", "application/json");
  175. // put("callbackBody", "{\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:var1},\"my_var2\":${x:var2}}");
  176. // }
  177. // });
  178. XLog.e("开始执行上传"+getFilePath()+objectKey+"上传的目录是:"+urlPath);
  179. // 设置进度回调
  180. put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
  181. @Override
  182. public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
  183. // 进度逻辑
  184. int progress = (int) ((double) currentSize / (double) totalSize * 100);
  185. Message msg = new Message();
  186. msg.arg1 = current;
  187. msg.arg2 = progress;
  188. msg.what = 3;
  189. uploadHandler.sendMessage(msg);
  190. //XLog.e("上上传百分比"+progress);
  191. }
  192. });
  193. // 异步上传
  194. taskId = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
  195. @Override
  196. public void onSuccess(PutObjectRequest request, PutObjectResult result) {
  197. if (BuildConfig.DEBUG){
  198. XLog.e(request);
  199. }
  200. Message msg = new Message();
  201. msg.arg1 = current;
  202. msg.obj = "/"+request.getObjectKey();
  203. msg.what = 2;
  204. uploadHandler.sendMessage(msg);
  205. // 只有设置了servercallback,该值才有数据。
  206. }
  207. @Override
  208. public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
  209. Message msg = new Message();
  210. msg.what = 1;
  211. msg.arg1 = current;
  212. XLog.e("上传失败,本地文件"+request.getUploadFilePath()+"上传目录"+request.getObjectKey());
  213. if (clientExcepion != null) {
  214. // 本地异常,如网络异常等。
  215. msg.obj = "网络异常,请稍后...";
  216. msg.arg2 = 1;
  217. uploadHandler.sendMessage(msg);
  218. XLog.e("RawMessage", clientExcepion.getMessage());
  219. XLog.e(clientExcepion);
  220. }
  221. if (serviceException != null) {
  222. msg.obj = "服务异常,请稍后...";
  223. msg.arg2 = 2;
  224. uploadHandler.sendMessage(msg);
  225. // 服务异常。
  226. XLog.e("ErrorCode", serviceException.getErrorCode());
  227. XLog.e("RequestId", serviceException.getRequestId());
  228. XLog.e("HostId", serviceException.getHostId());
  229. XLog.e("RawMessage", serviceException.getRawMessage());
  230. }
  231. }
  232. });
  233. }
  234. }
  235. }