OssFileUtil.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package com.taiyi.tyusbsdk;
  2. import android.content.Context;
  3. import com.alibaba.sdk.android.oss.ClientConfiguration;
  4. import com.alibaba.sdk.android.oss.ClientException;
  5. import com.alibaba.sdk.android.oss.OSS;
  6. import com.alibaba.sdk.android.oss.OSSClient;
  7. import com.alibaba.sdk.android.oss.ServiceException;
  8. import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
  9. import com.alibaba.sdk.android.oss.callback.OSSProgressCallback;
  10. import com.alibaba.sdk.android.oss.common.OSSLog;
  11. import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
  12. import com.alibaba.sdk.android.oss.common.auth.OSSCustomSignerCredentialProvider;
  13. import com.alibaba.sdk.android.oss.common.utils.OSSUtils;
  14. import com.alibaba.sdk.android.oss.model.PutObjectRequest;
  15. import com.alibaba.sdk.android.oss.model.PutObjectResult;
  16. import com.taiyi.tyusbsdk.pulse.TaiyiConfig;
  17. import java.util.Objects;
  18. import okhttp3.Headers;
  19. import okhttp3.HttpUrl;
  20. import okhttp3.OkHttpClient;
  21. import okhttp3.Request;
  22. public class OssFileUtil {
  23. private static final ClientConfiguration config = new ClientConfiguration();
  24. private static OssFileUtil mUploadFileBiz;
  25. public static String bucketName = "taiyi";
  26. public static String endPoint = "https://oss-cn-beijing.aliyuncs.com";
  27. public static String target = endPoint.replaceFirst("^(https?://)oss-", "$1" + bucketName + ".oss-");
  28. public static OssFileUtil getInstance() {
  29. if (mUploadFileBiz == null) {
  30. mUploadFileBiz = new OssFileUtil();
  31. }
  32. return mUploadFileBiz;
  33. }
  34. static {
  35. config.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
  36. config.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
  37. config.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个。
  38. config.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
  39. }
  40. public static void setProxy(TaiyiConfig.OSSAgency agency) {
  41. String proxy = agency.getUrl();
  42. if (proxy == null || proxy.isEmpty()) return;
  43. android.util.Log.i("log:proxy", "[oss] 设置代理: " + proxy + " ("+ target + ")");
  44. final String prefix = target;
  45. OkHttpClient client = new OkHttpClient.Builder().addInterceptor(chain -> {
  46. Request originalRequest = chain.request();
  47. String requestUrl = originalRequest.url().toString();
  48. if (requestUrl.startsWith(prefix)) {
  49. String proxyUrl = requestUrl.replaceFirst(prefix, proxy);
  50. String proxyMethod = agency.getMethod();
  51. HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(proxyUrl)).newBuilder();
  52. Request.Builder requestBuilder = originalRequest.newBuilder();
  53. // 请求方法
  54. if (proxyMethod != null && !proxyMethod.trim().isEmpty()) requestBuilder.method(proxyMethod, originalRequest.body());
  55. // 请求头 -> 查询参数
  56. if (agency.isHeader2Query()) {
  57. // 1. 获取原有 headers
  58. Headers headers = originalRequest.headers();
  59. // 2. 遍历 headers,添加到 url 查询参数
  60. for (int i = 0; i < headers.size(); i++) urlBuilder.addQueryParameter(headers.name(i), headers.value(i));
  61. // 3. 清空 headers
  62. requestBuilder.headers(new Headers.Builder().build());
  63. }
  64. HttpUrl url = urlBuilder.build();
  65. requestBuilder.url(url);
  66. // 同步修改 Host 头
  67. if (url.host() != null) requestBuilder.header("host", url.host());
  68. Request proxyRequest = requestBuilder.build();
  69. android.util.Log.d("log:proxy", "[oss] OkHttp URL: [" + proxyRequest.method() + "]" + proxyRequest.url() + " (" + prefix + ")");
  70. return chain.proceed(proxyRequest);
  71. } else {
  72. android.util.Log.d("log:proxy", "[oss] OkHttp URL: " + requestUrl);
  73. return chain.proceed(originalRequest);
  74. }
  75. }).build();
  76. config.setOkHttpClient(client);
  77. }
  78. private OssFileUtil() {
  79. }
  80. /**
  81. * 上传文件
  82. *
  83. * @param context 上下文
  84. * @param key 在阿里云存储的路径 不要以 / 开头
  85. * @param path //本地路径
  86. * @param progressCallback 上传图片的进度条的回调接口
  87. * @throws ClientException 本地异常
  88. * @throws ServiceException 阿里云服务器异常
  89. */
  90. public void upload(Context context, String key, String path, OSSProgressCallback<PutObjectRequest> progressCallback,
  91. OSSCompletedCallback<PutObjectRequest, PutObjectResult> completedCallback) throws ClientException,
  92. ServiceException {
  93. OSSLog.enableLog();
  94. OSSCredentialProvider credentialProvider = new OSSCustomSignerCredentialProvider() {
  95. @Override
  96. public String signContent(String content) {
  97. return OSSUtils.sign("LTAI4G1g4B6rQeuh8oHiMrvz", "iVB8DzOfFeyLAsEMdAfokeaOEsn33T", content);
  98. }
  99. };
  100. OSS sOss = new OSSClient(context, OssFileUtil.endPoint, credentialProvider, config);
  101. PutObjectRequest put = new PutObjectRequest(bucketName, key, path);
  102. if (progressCallback != null) {
  103. put.setProgressCallback(progressCallback);
  104. }
  105. sOss.asyncPutObject(put, completedCallback);
  106. }
  107. }