Android端使用阿里OSS上傳

最近一直沒更新博客,因?yàn)槎紝懙搅斯镜膚iki上,我覺得博客是有必要的,記錄一下自己成長過程中的一點(diǎn)一滴吧。

這節(jié)課,說一下阿里的OSS,可能會(huì)有一點(diǎn)坑。 還有我自己封裝的一個(gè)比較low的工具類。

我們選擇了將文件直接上傳到OSS,然后拿到文件的url,將url交給服務(wù)器保存。這樣一來就大大減少了服務(wù)器的壓力。

直接上自己封裝的工具類代碼吧。(直接拿去就可以用)

1.配置依賴:

compile'com.aliyun.[dpa:oss-android-sdk:+](http://dpaoss-android-sdk+/)'//這里用sdk+ 是為了隨時(shí)跟隨oss的版本更新,oss也會(huì)隨時(shí)修復(fù)bug。

 compile'com.squareup.[okhttp3:okhttp:3.4.1](http://okhttp3okhttp:3.4.1/)'//

由于OSS底層封裝是ok,所以ok的依賴也得有

compile'com.squareup.[okio:okio:1.9.0](http://okiookio:1.9.0/)'

2.********這里權(quán)限就不貼代碼了,什么網(wǎng)絡(luò)權(quán)限,文件讀取權(quán)限記得不要少。***********

3.然后是混淆(很重要)


-keep class com.alibaba.sdk.android.oss.** { *; }

-dontwarn okio.**

-dontwarn org.apache.commons.codec.binary.**

4.然后就是代碼了


/**

* Created by yangjinyang on 2018/4/19.

* 姓名:楊阿陽阿陽

* 類說明:Oss上傳工具類

*/

public class MyOSSUtils {

private static MyOSSUtilsinstance;

private final StringP_ENDPOINT ="http://oss-cn-beijing.aliyuncs.com";//主機(jī)地址(OSS文檔中有提到)

private final StringP_STSSERVER = UrlHelper.BASE_URL +"get_aliyun_oss_sts";(服務(wù)器域名)

private final StringP_BUCKETNAME ="文件夾名字";(文件夾名字)

private OSSoss;

private SimpleDateFormatsimpleDateFormat;

public MyOSSUtils() {

}

public static MyOSSUtils getInstance() {

if (instance ==null) {

if (instance ==null) {

return new MyOSSUtils();

}

}

return instance;

}

private void getOSs(Context context) {

//推薦使用OSSAuthCredentialsProvider。token過期可以及時(shí)更新

 OSSCredentialProvider credentialProvider =new OSSAuthCredentialsProvider(P_STSSERVER);

//該配置類如果不設(shè)置,會(huì)有默認(rèn)配置,具體可看該類

 ClientConfiguration conf =new ClientConfiguration();

conf.setConnectionTimeout(15 *1000);// 連接超時(shí),默認(rèn)15秒

 conf.setSocketTimeout(15 *1000);// socket超時(shí),默認(rèn)15秒

 conf.setMaxConcurrentRequest(5);// 最大并發(fā)請(qǐng)求數(shù),默認(rèn)5個(gè)

 conf.setMaxErrorRetry(2);// 失敗后最大重試次數(shù),默認(rèn)2次

 oss =new OSSClient(context,P_ENDPOINT, credentialProvider);

if (simpleDateFormat==null){

simpleDateFormat =new SimpleDateFormat("yyyyMMdd");

}

}

/**

* 上傳圖片 上傳文件

*

* @param context application上下文對(duì)象

* @param ossUpCallback 成功的回調(diào)

* @param img_name 上傳到oss后的文件名稱,圖片要記得帶后綴 如:.jpg

* @param imgPath 圖片的本地路徑

*/

 public void upImage(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String img_name, String imgPath) {

getOSs(context);

final Date data =new Date();

data.setTime(System.currentTimeMillis());

PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+  img_name, imgPath);

putObjectRequest.setProgressCallback(new OSSProgressCallback() {

@Override

 public void onProgress(PutObjectRequest request,long currentSize,long totalSize) {

ossUpCallback.inProgress(currentSize, totalSize);

}

});

oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {

@Override

 public void onSuccess(PutObjectRequest request, PutObjectResult result) {

Log.e("MyOSSUtils","------getRequestId:" + result.getRequestId());

// try {

 ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+img_name));

// } catch (ClientException e) {

// e.printStackTrace();

// }

 }

@Override

 public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {

ossUpCallback.successImg(null);

}

});

}

/**

* 上傳圖片 上傳流

*

* @param context application上下文對(duì)象

* @param ossUpCallback 成功的回調(diào)

* @param img_name 上傳到oss后的文件名稱,圖片要記得帶后綴 如:.jpg

* @param imgbyte 圖片的byte數(shù)組

*/

 public void upImage(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String img_name,byte[] imgbyte) {

getOSs(context);

final Date data =new Date();

data.setTime(System.currentTimeMillis());

PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+ img_name, imgbyte);

putObjectRequest.setProgressCallback(new OSSProgressCallback() {

@Override

 public void onProgress(PutObjectRequest request,long currentSize,long totalSize) {

ossUpCallback.inProgress(currentSize, totalSize);

}

});

oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {

@Override

 public void onSuccess(PutObjectRequest request, PutObjectResult result) {

Log.e("MyOSSUtils","------getRequestId:" + result.getRequestId());

ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+img_name));

}

@Override

 public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {

ossUpCallback.successImg(null);

}

});

}

/**

* 上傳視頻

*

* @param context application上下文對(duì)象

* @param ossUpCallback 成功的回調(diào)

* @param video_name 上傳到oss后的文件名稱,視頻要記得帶后綴 如:.mp4

* @param video_path 視頻的本地路徑

*/

 public void upVideo(Context context,final MyOSSUtils.OssUpCallback ossUpCallback,final String video_name, String video_path) {

getOSs(context);

final Date data =new Date();

data.setTime(System.currentTimeMillis());

PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+ video_name, video_path);

putObjectRequest.setProgressCallback(new OSSProgressCallback() {

@Override

 public void onProgress(PutObjectRequest request,long currentSize,long totalSize) {

ossUpCallback.inProgress(currentSize, totalSize);

}

});

oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {

@Override

 public void onSuccess(PutObjectRequest request, PutObjectResult result) {

ossUpCallback.successVideo(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+video_name));

}

@Override

 public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {

ossUpCallback.successVideo(null);

}

});

}

public interface OssUpCallback {

void successImg(String img_url);

void successVideo(String video_url);

void inProgress(long progress,long zong);

}

}

現(xiàn)在你們看到的結(jié)果是完美的,可是不知它的過程有多么痛苦;接下來闡述幾個(gè)坑:

1、傳音視頻和圖片的時(shí)候,文件名稱結(jié)尾一定要加上.mp4、.jpg、.png等后綴,直接拿本地的路徑雖然有后綴,但是OSS那邊是另一套名字。

2、當(dāng)服務(wù)端要求存到某一個(gè)文件夾中的時(shí)候,一定是"文件夾名字 / 文件名" 開始和結(jié)尾一定一定不要帶 "/"。

3、OSS官方?jīng)]有給出文件批量上傳的方法,OSS官方?jīng)]有給出文件批量上傳的方法,OSS官方?jīng)]有給出文件批量上傳的方法。重要的事情要說三遍。

4、OSS官方相關(guān)的安卓文檔貌似并沒有提到怎么拿到文件的url,但是工具類中已經(jīng)有寫到了:

oss.presignPublicObjectURL(P_BUCKETNAME, simpleDateFormat.format(data)+"/"+ img_name);//BUCKETNAME名字和文件名字。一定要在異步上傳完成之后調(diào)用。

這里我沒有做一個(gè)eg,因?yàn)槠鋵?shí)官網(wǎng)的文檔寫的還是不錯(cuò)的,我覺得你要了解一個(gè)SDK一定要先看看API,然后才看工具類。這樣你會(huì)特別明了。

有什么不好的地方可以提出,謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,175評(píng)論 3 119
  • 剛才的一瞬間我仿佛明白了很多,這些明白就像是郭敬明寫下的人是一瞬間變老的一樣。 看到班上幾個(gè)同學(xué)她們?cè)诔皇孜也恢?..
    阿l四閱讀 192評(píng)論 0 0
  • 拍攝這張照片之前三個(gè)半小時(shí)的時(shí)間里,老金和小祁正像新藏線上的修路工人一樣,在海拔4000多米的無人區(qū)揚(yáng)塵掘土的把我...
    孤魂玄子閱讀 275評(píng)論 0 2
  • 期待在春天與你相遇,等候在夏天你一襲長裙。相遇和長裙都有了,一切是如此美好。 要經(jīng)歷多少事情,才可以把“我”變成“...
    慢半拍兒的閃電閱讀 268評(píng)論 0 1
  • 兒子寫日記 : 夜深了,媽媽在打麻將,爸爸在上網(wǎng)…… 爸爸檢查時(shí),很不滿意地說 : 日記源于生活,但要...
    帥氣的阿莉閱讀 214評(píng)論 0 0

友情鏈接更多精彩內(nèi)容