package com.taiyi.tyusbsdk; import android.content.Context; import com.alibaba.sdk.android.oss.ClientConfiguration; import com.alibaba.sdk.android.oss.ClientException; import com.alibaba.sdk.android.oss.OSS; import com.alibaba.sdk.android.oss.OSSClient; import com.alibaba.sdk.android.oss.ServiceException; import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; import com.alibaba.sdk.android.oss.callback.OSSProgressCallback; import com.alibaba.sdk.android.oss.common.OSSLog; import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; import com.alibaba.sdk.android.oss.common.auth.OSSCustomSignerCredentialProvider; import com.alibaba.sdk.android.oss.common.utils.OSSUtils; import com.alibaba.sdk.android.oss.model.PutObjectRequest; import com.alibaba.sdk.android.oss.model.PutObjectResult; import com.taiyi.tyusbsdk.pulse.TaiyiConfig; import java.util.Objects; import okhttp3.Headers; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; public class OssFileUtil { private static final ClientConfiguration config = new ClientConfiguration(); private static OssFileUtil mUploadFileBiz; public static String bucketName = "taiyi"; public static String endPoint = "https://oss-cn-beijing.aliyuncs.com"; public static String target = endPoint.replaceFirst("^(https?://)oss-", "$1" + bucketName + ".oss-"); public static OssFileUtil getInstance() { if (mUploadFileBiz == null) { mUploadFileBiz = new OssFileUtil(); } return mUploadFileBiz; } static { config.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。 config.setSocketTimeout(15 * 1000); // socket超时,默认15秒。 config.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个。 config.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。 } public static void setProxy(TaiyiConfig.OSSAgency agency) { String proxy = agency.getUrl(); if (proxy == null || proxy.isEmpty()) return; android.util.Log.i("log:proxy", "[oss] 设置代理: " + proxy + " ("+ target + ")"); final String prefix = target; OkHttpClient client = new OkHttpClient.Builder().addInterceptor(chain -> { Request originalRequest = chain.request(); String requestUrl = originalRequest.url().toString(); if (requestUrl.startsWith(prefix)) { String proxyUrl = requestUrl.replaceFirst(prefix, proxy); String proxyMethod = agency.getMethod(); HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(proxyUrl)).newBuilder(); Request.Builder requestBuilder = originalRequest.newBuilder(); // 请求方法 if (proxyMethod != null && !proxyMethod.trim().isEmpty()) requestBuilder.method(proxyMethod, originalRequest.body()); // 请求头 -> 查询参数 if (agency.isHeader2Query()) { // 1. 获取原有 headers Headers headers = originalRequest.headers(); // 2. 遍历 headers,添加到 url 查询参数 for (int i = 0; i < headers.size(); i++) urlBuilder.addQueryParameter(headers.name(i), headers.value(i)); // 3. 清空 headers requestBuilder.headers(new Headers.Builder().build()); } HttpUrl url = urlBuilder.build(); requestBuilder.url(url); // 同步修改 Host 头 if (url.host() != null) requestBuilder.header("host", url.host()); Request proxyRequest = requestBuilder.build(); android.util.Log.d("log:proxy", "[oss] OkHttp URL: [" + proxyRequest.method() + "]" + proxyRequest.url() + " (" + prefix + ")"); return chain.proceed(proxyRequest); } else { android.util.Log.d("log:proxy", "[oss] OkHttp URL: " + requestUrl); return chain.proceed(originalRequest); } }).build(); config.setOkHttpClient(client); } private OssFileUtil() { } /** * 上传文件 * * @param context 上下文 * @param key 在阿里云存储的路径 不要以 / 开头 * @param path //本地路径 * @param progressCallback 上传图片的进度条的回调接口 * @throws ClientException 本地异常 * @throws ServiceException 阿里云服务器异常 */ public void upload(Context context, String key, String path, OSSProgressCallback progressCallback, OSSCompletedCallback completedCallback) throws ClientException, ServiceException { OSSLog.enableLog(); OSSCredentialProvider credentialProvider = new OSSCustomSignerCredentialProvider() { @Override public String signContent(String content) { return OSSUtils.sign("LTAI4G1g4B6rQeuh8oHiMrvz", "iVB8DzOfFeyLAsEMdAfokeaOEsn33T", content); } }; OSS sOss = new OSSClient(context, OssFileUtil.endPoint, credentialProvider, config); PutObjectRequest put = new PutObjectRequest(bucketName, key, path); if (progressCallback != null) { put.setProgressCallback(progressCallback); } sOss.asyncPutObject(put, completedCallback); } }