簡單粗暴,代碼拷貝即可使用
public class OssManager { /** * Created by Administrator on 2017/3/1. */ private picResultCallback callback;//回調接口 private OSS oss; private Context contexts; public static OssManager getInstance() { return OssInstance.instance; } private static class OssInstance { private static final OssManager instance = new OssManager(); } private OssManager() { } private String bucketName; private String accessKeyId; boolean isok = false; /** * 初始化 * * @param context * @param endpoint * @param bucketName * @param accessKeyId * @param accessKeySecret * @param token * @param callback * @return */ public OssManager init(Context context, String endpoint, String bucketName, String accessKeyId, String accessKeySecret, String token, picResultCallback callback) { if (oss == null) { Log.i("eeee", "11111"); // OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret); Log.e("TAG", "accessKeyId=" + accessKeyId); Log.e("TAG", "accessKeySecret=" + accessKeySecret); Log.e("TAG", "token=" + token); OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, token); // try { // OSSFederationToken federationToken = credentialProvider.getFederationToken(); // } catch (ClientException e) { // e.printStackTrace(); // } ClientConfiguration conf = new ClientConfiguration(); conf.setConnectionTimeout(15 * 1000); // 連接超時,默認15秒 conf.setSocketTimeout(15 * 1000); // socket超時,默認15秒 conf.setMaxConcurrentRequest(5); // 最大併發請求書,默認5個 conf.setMaxErrorRetry(2); // 失敗後最大重試次數,默認2次 OSSClient ossClient = new OSSClient(context, endpoint, credentialProvider, conf); oss = ossClient; // ossClient.generatePresignedUrl // OSS oss = new OSSClient( context,endpoint, credentialProvider, endpoint); Log.e("aaaaaa", "初始化完畢"); OSSLog.enableLog(); } this.bucketName = bucketName; this.accessKeyId = accessKeyId; this.callback = callback; this.contexts = context; return OssInstance.instance; } private OSSBean RequestToken() { OSSBean ossBean = null; return ossBean; } public OSS getOss() { return oss; } /** * 普通上傳,比如image **/ OSSAsyncTask task; public void upload(String name, String filePath, final int type, final picResultCallback callback) { // 構造上傳請求 PutObjectRequest put = new PutObjectRequest(bucketName, name + ".jpg", filePath); // 異步上傳時可以設置進度回調 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { LogUtils.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { callback.getPicData(true, type); // 只有設置了servercallback,這個值纔有數據 String serverCallbackReturnJson = result.getServerCallbackReturnBody(); LogUtils.e("oss_upSucceed", serverCallbackReturnJson); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { LogUtils.e("oss_上傳失敗"); // 請求異常 if (clientExcepion != null) { // 本地異常如網絡異常等 clientExcepion.printStackTrace(); LogUtils.e("oss_上傳失敗message", clientExcepion.getMessage()); } if (serviceException != null) { LogUtils.e("oss_上傳失敗code", serviceException.getErrorCode() + "\n<-->" + serviceException.getRequestId() + "\n<-->" + serviceException.getHostId() + "\n<-->" + serviceException.getRawMessage()); } } }); // task.cancel(); // 可以取消任務 task.waitUntilFinished(); // 可以等待直到任務完成 } /** * 普通上傳,比如image **/ public void upload2(Bundle bundle, byte[] bytes) { String name = bundle.getString("name"); int count = 0; Log.e("aaaaname", name + ":" + bytes); // 構造上傳請求 PutObjectRequest put = new PutObjectRequest(bucketName, name + ".jpg", bytes); // 異步上傳時可以設置進度回調 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { } }); task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { int statusCode = result.getStatusCode(); Log.e("aaaaa2a", "result"); callback.getPicData2(true, 0); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { Log.e("aaaaaa", "onFailure"); // Log.e("aaaaaa",clientExcepion.getMessage()); Log.e("aaaaaa", serviceException.getErrorCode()); Log.e("aaaaaa", request.getBucketName()); Log.e("aaaaaa", request.getUploadFilePath()); // 請求異常 if (clientExcepion != null) { // 本地異常如網絡異常等 clientExcepion.printStackTrace(); Log.e("aaaa", clientExcepion.getMessage()); } if (serviceException != null) { // 服務異常 Log.e("aaaaErrorCode", serviceException.getErrorCode()); Log.e("aaaaRequestId", serviceException.getRequestId()); Log.e("aaaaHostId", serviceException.getHostId()); Log.e("aaaaRawMessage", serviceException.getRawMessage()); } } }); // task.cancel(); // 可以取消任務 task.waitUntilFinished(); // 可以等待直到任務完成 } public boolean image(String name, String filePath, final List<String> addIm, final List<String> compareList) { Log.e("TAG", "name" + name); // PutObjectRequest put = new PutObjectRequest(bucketName, "<objectKey>", "<uploadFilePath>"); PutObjectRequest put = new PutObjectRequest(bucketName, name + ".jpg", filePath); // 異步上傳時可以設置進度回調 put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() { @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); if (oss == null) { } OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { Log.e("PutObject", "UploadSuccess"); Log.e("ETag", result.getETag()); Log.e("RequestId", result.getRequestId()); Log.e("UploadFilePath", request.getUploadFilePath()); Log.e("code", result.getStatusCode() + ""); Log.e("resultBody", result.getServerCallbackReturnBody()); compareList.add("1"); } @Override public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { Log.e("aaaaaa", "onFailure"); isok = false; Log.e("aaaaaa", request.getBucketName()); // 請求異常 if (clientExcepion != null) { // 本地異常如網絡異常等 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服務異常 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); return isok; } /** * 分片上傳 **/ public void pullFP(String filePath, String name) throws ClientException, ServiceException { String uploadId; InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, name); InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init); uploadId = initResult.getUploadId(); long partSize = 128 * 1024; // 設置分片大小 int currentIndex = 1; // 上傳分片編號,從1開始 File uploadFile = new File(filePath); // 需要分片上傳的文件 InputStream input = null; try { input = new FileInputStream(uploadFile); } catch (FileNotFoundException e) { e.printStackTrace(); } long fileLength = uploadFile.length(); long uploadedLength = 0; List<PartETag> partETags = new ArrayList<PartETag>(); // 保存分片上傳的結果 while (uploadedLength < fileLength) { int partLength = (int) Math.min(partSize, fileLength - uploadedLength); byte[] partData = new byte[0]; // 按照分片大小讀取文件的一段內容 try { partData = IOUtils.readStreamAsBytesArray(input, partLength); } catch (IOException e) { e.printStackTrace(); } UploadPartRequest uploadPart = new UploadPartRequest(bucketName, name, uploadId, currentIndex); uploadPart.setPartContent(partData); // 設置分片內容 UploadPartResult uploadPartResult = null; try { uploadPartResult = oss.uploadPart(uploadPart); } catch (ClientException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } partETags.add(new PartETag(currentIndex, uploadPartResult.getETag())); // 保存分片上傳成功後的結果 uploadedLength += partLength; currentIndex++; Log.e("currentIndex", currentIndex + ""); } CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, name, uploadId, partETags); final CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete); complete.setCallbackParam(new HashMap<String, String>() { { Log.e("uploadEnd", "uploadEnd"); Log.e("multipartUpload", "multipart upload success! Location: " + completeResult.getLocation()); put("callbackUrl", "<server address>"); put("callbackBody", "<test>"); } }); ListPartsRequest listParts = new ListPartsRequest(bucketName, name, uploadId); ListPartsResult result = oss.listParts(listParts); for (int i = 0; i < result.getParts().size(); i++) { Log.e("已上傳分片", "partNum: " + result.getParts().get(i).getPartNumber()); Log.e("已上傳分片", "partEtag: " + result.getParts().get(i).getETag()); Log.e("已上傳分片", "lastModified: " + result.getParts().get(i).getLastModified()); Log.e("已上傳分片", "partSize: " + result.getParts().get(i).getSize()); } } public interface picResultCallback { void getPicData(boolean b, int type); void getPicData2(boolean b, int type); } }
使用方法:
首先,先請求你公司得阿里雲庫地址獲取AccesskeyId,AccessKeySecret,SecuityToken這些東西,然後進行init操作
Gson gson = new Gson(); OSSBean s = gson.fromJson(data, OSSBean.class); String accessKeyId = s.getAccessKeyId(); String accessKeySecret = s.getAccessKeySecret(); String securityToken = s.getSecurityToken(); String bucketName = "invest01"; OssManager.getInstance().init(IdentityInfoNewActivity.this, CN, bucketName, accessKeyId, accessKeySecret, securityToken, new OssManager.picResultCallback() { @Override public void getPicData(boolean b, int type) { } @Override public void getPicData2(boolean b, int type) { } });
這裏貼出一個OssBean類,便於操作
public class OSSBean { private String StatusCode; private String AccessKeyId; private String AccessKeySecret; private String SecurityToken; private String Expiration; public String getStatusCode() { return StatusCode; } public void setStatusCode(String StatusCode) { this.StatusCode = StatusCode; } public String getAccessKeyId() { return AccessKeyId; } public void setAccessKeyId(String AccessKeyId) { this.AccessKeyId = AccessKeyId; } public String getAccessKeySecret() { return AccessKeySecret; } public void setAccessKeySecret(String AccessKeySecret) { this.AccessKeySecret = AccessKeySecret; } public String getSecurityToken() { return SecurityToken; } public void setSecurityToken(String SecurityToken) { this.SecurityToken = SecurityToken; } public String getExpiration() { return Expiration; } public void setExpiration(String Expiration) { this.Expiration = Expiration; } }
然後init完畢,對圖片進行upload:
//10086是阿里雲傳完圖片的回調給你的用來區分的標誌位,我瞎寫的
OssManager.getInstance().upload(slicingTime , path, 10086, new OssManager.picResultCallback() { @Override public void getPicData(boolean b, int type) { //圖片拼接路徑 String lujing = "https://你的bucketName.oss-cn-beijing.aliyuncs.com/" + slicingTime + ".jpg"; runOnUiThread(new Runnable() { @Override public void run() { //上傳圖片給後臺 upLoadImage(urlpath); } }); } @Override public void getPicData2(boolean b, int type) { } });