Android OSS上傳圖片到阿里云

Android OSS上傳圖片到阿里云

我所采取的上傳方式為異步上傳,如果需要多張圖片的話怔毛,可以直接循環(huán)上傳就可以腾降。

官方文檔:https://help.aliyun.com/document_detail/93939.html?spm=a2c4g.11186623.6.1053.71a2bdce5HlAsk

依賴配置:(如果sdk依賴不同的話,部分類會出現(xiàn)導(dǎo)包失敗的現(xiàn)象)

implementation'com.aliyun.dpa:oss-android-sdk:+'

implementation'com.squareup.okhttp3:okhttp:3.4.1'

implementation'com.squareup.okio:okio:1.9.0'

清單文件中所需要的權(quán)限:

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

混淆設(shè)置:

-keepclasscom.alibaba.sdk.android.oss.** {*; }

-dontwarn okio.**

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

工具類(這個工具類不涉及其他工具類抗果,如果有導(dǎo)入錯誤現(xiàn)象映穗,就查詢配置的依賴是否有更新之類):

package lib.common.utils;

import android.content.Context;

import android.util.Log;

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.auth.OSSAuthCredentialsProvider;

import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;

import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;

import com.alibaba.sdk.android.oss.model.OSSRequest;

import com.alibaba.sdk.android.oss.model.OSSResult;

import com.alibaba.sdk.android.oss.model.PutObjectRequest;

import com.alibaba.sdk.android.oss.model.PutObjectResult;

import java.text.SimpleDateFormat;

import java.util.Date;

import static okhttp3.internal.Internal.instance;

public class MyOSSUtils {

private static MyOSSUtilsinstance;

? ? /**

* 主機地址(根據(jù)地區(qū)而變化)

*/

? ? private final StringP_ENDPOINT ="https://oss-cn-beijing.aliyuncs.com";

? ? /**

* (服務(wù)器域名蚁滋,后臺給)

*/

? ? private final StringP_STSSERVER ="";

? ? private final StringP_BUCKETNAME ="course-client";

? ? private OSSoss;

? ? private SimpleDateFormatsimpleDateFormat;

? ? /**

* (文件夾名字赘淮,與后臺統(tǒng)一)

*/

? ? private final StringOBJECT_NAME ="";

? ? public MyOSSUtils() {

}

public static MyOSSUtilsgetInstance() {

if (instance ==null) {

if (instance ==null) {

return new MyOSSUtils();

? ? ? ? ? ? }

}

return instance;

? ? }

private void getOSs(Context context) {

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

? ? ? ? OSSCredentialProvider credentialProvider =new OSSAuthCredentialsProvider(P_STSSERVER);

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

? ? ? ? ClientConfiguration conf =new ClientConfiguration();

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

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

? ? ? ? conf.setMaxConcurrentRequest(5);// 最大并發(fā)請求數(shù)恤批,默認(rèn)5個

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

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

? ? ? ? if (simpleDateFormat ==null) {

simpleDateFormat =new SimpleDateFormat("yyyyMMdd");

? ? ? ? }

}

/**

* 上傳圖片 上傳文件

*

? ? * @param context? ? ? application上下文對象

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

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

? ? * @param imgPath? ? ? 圖片的本地路徑

*/

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

getOSs(context);

//? ? ? ? final Date data = new Date();

//

//? ? ? ? data.setTime(System.currentTimeMillis());

? ? ? ? PutObjectRequest putObjectRequest =new PutObjectRequest(P_BUCKETNAME,? OBJECT_NAME +"/" + img_name, imgPath);

? ? ? ? // 異步上傳時可以設(shè)置進度回調(diào)延都。

? ? ? ? putObjectRequest.setProgressCallback(new OSSProgressCallback() {

@Override

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

Log.d("PutObject", "currentSize: " + currentSize +" totalSize: " + totalSize);

? ? ? ? ? ? }

});

? ? ? ? OSSAsyncTask task =oss.asyncPutObject(putObjectRequest, new OSSCompletedCallback() {

@Override

? ? ? ? ? ? public void onSuccess(PutObjectRequest request, PutObjectResult result) {

Log.d("PutObject", "UploadSuccess");

? ? ? ? ? ? ? ? Log.d("ETag", result.getETag());

? ? ? ? ? ? ? ? Log.d("RequestId", result.getRequestId());

? ? ? ? ? ? }

@Override

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

// 請求異常晰房。

? ? ? ? ? ? ? ? if (clientExcepion !=null) {

// 本地異常酵颁,如網(wǎng)絡(luò)異常等月帝。

? ? ? ? ? ? ? ? ? ? clientExcepion.printStackTrace();

? ? ? ? ? ? ? ? }

if (serviceException !=null) {

// 服務(wù)異常。

? ? ? ? ? ? ? ? ? ? Log.e("ErrorCode", serviceException.getErrorCode());

? ? ? ? ? ? ? ? ? ? Log.e("RequestId", serviceException.getRequestId());

? ? ? ? ? ? ? ? ? ? Log.e("HostId", serviceException.getHostId());

? ? ? ? ? ? ? ? ? ? Log.e("RawMessage", serviceException.getRawMessage());

? ? ? ? ? ? ? ? }

}

});

? ? ? ? oss.asyncPutObject(putObjectRequest, new OSSCompletedCallback() {

@Override

? ? ? ? ? ? public void onSuccess(OSSRequest request, OSSResult result) {

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

? ? ? ? ? ? ? ? ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,? OBJECT_NAME +"/" +img_name));

? ? ? ? ? ? }

@Override

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

ossUpCallback.successImg(null);

? ? ? ? ? ? }

});

? ? }

/**

* 上傳圖片 上傳流

*

? ? * @param context? ? ? application上下文對象

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

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

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

*/

? ? public void upImage(Context context, final MyOSSUtils.OssUpCallback ossUpCallback, final Stringimg_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(Object request, long currentSize, long totalSize) {

ossUpCallback.inProgress(currentSize, totalSize);

? ? ? ? ? ? }

});

? ? ? ? oss.asyncPutObject(putObjectRequest, new OSSCompletedCallback() {

@Override

? ? ? ? ? ? public void onSuccess(OSSRequest request, OSSResult result) {

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

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

? ? ? ? ? ? }

@Override

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

ossUpCallback.successImg(null);

? ? ? ? ? ? }

});

? ? }

/**

* 上傳視頻

*

? ? * @param context? ? ? application上下文對象

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

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

? ? * @param video_path? ? 視頻的本地路徑

*/

? ? public void upVideo(Context context, final MyOSSUtils.OssUpCallback ossUpCallback, final Stringvideo_name, Stringvideo_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(Object request, long currentSize, long totalSize) {

ossUpCallback.inProgress(currentSize, totalSize);

? ? ? ? ? ? }

});

? ? ? ? oss.asyncPutObject(putObjectRequest, new OSSCompletedCallback() {

@Override

? ? ? ? ? ? public void onSuccess(OSSRequest request, OSSResult result) {

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

? ? ? ? ? ? }

@Override

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

ossUpCallback.successVideo(null);

? ? ? ? ? ? }

});

? ? }

public interface OssUpCallback {

void successImg(Stringimg_url);

? ? ? ? void successVideo(Stringvideo_url);

? ? ? ? void inProgress(long progress, long zong);

? ? }

}

調(diào)用方式:

參數(shù)攜帶具體根據(jù)與后臺協(xié)商所定?

//上傳到阿里云

MyOSSUtils.getInstance().upImage(this, object : MyOSSUtils.OssUpCallback {

override fun successImg(img_url: String?) {

//在上傳阿里云成功的回調(diào)中 在=將阿里云返回的url地址上傳給后臺即可

}

override fun successVideo(video_url: String?) {

}

override fun inProgress(progress: Long, zong: Long) {

}

}, “” +".jpg", cropImagePath)

備注:我上傳時用到的地方就這么多域仇,如果有問題寺擂,或者報異常直接可以在官網(wǎng)里根據(jù)所報異常去查詢

調(diào)用方式使用的是kotlin代碼,用的就是工具類里面的方法回調(diào)垦细,就OK了挡逼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市家坎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惹骂,老刑警劉巖订框,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衩侥,居然都是意外死亡矛物,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門峦萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爱榔,你說我怎么就攤上這事∩富叮” “怎么了唇聘?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剥险。 經(jīng)常有香客問我宪肖,道長,這世上最難降的妖魔是什么匈庭? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任阱持,我火速辦了婚禮魔熏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒜绽。我一直安慰自己,他們只是感情好鼎姊,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布相赁。 她就那樣靜靜地躺著,像睡著了一般唤衫。 火紅的嫁衣襯著肌膚如雪绵脯。 梳的紋絲不亂的頭發(fā)上休里,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天赃承,我揣著相機與錄音,去河邊找鬼瞧剖。 笑死,一個胖子當(dāng)著我的面吹牛噩凹,可吹牛的內(nèi)容都是我干的毡咏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼堵泽,長吁一口氣:“原來是場噩夢啊……” “哼恢总!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起片仿,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厢岂,沒想到半個月后阳距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卒茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年咖熟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辜昵。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡咽斧,死狀恐怖躬存,靈堂內(nèi)的尸體忽然破棺而出舀锨,到底是詐尸還是另有隱情,我是刑警寧澤坎匿,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布替蔬,位于F島的核電站,受9級特大地震影響承桥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜀撑,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一剩彬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喉恋,春花似錦、人聲如沸绍坝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勤讽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間向臀,已是汗流浹背诸狭。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工君纫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芹彬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓会喝,卻偏偏與公主長得像玩郊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子译红,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容