OssService.java 11 KB

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