日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android端使用阿里OSS上传

發布時間:2024/3/26 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android端使用阿里OSS上传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載:https://www.jianshu.com/p/6a5b47ca2b37

https://help.aliyun.com/document_detail/93939.html?spm=a2c4g.11186623.6.1089.68e6a31fHzzILj

這節課,說一下阿里的OSS,可能會有一點坑。 還有我自己封裝的一個比較low的工具類。

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

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

1.配置依賴:

compile'com.aliyun.[dpa:oss-android-sdk:+](http://dpaoss-android-sdk+/)'//這里用sdk+ 是為了隨時跟隨oss的版本更新,oss也會隨時修復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.********這里權限就不貼代碼了,什么網絡權限,文件讀取權限記得不要少。***********

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";//主機地址(OSS文檔中有提到)private final StringP_STSSERVER = UrlHelper.BASE_URL +"get_aliyun_oss_sts";(服務器域名)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過期可以及時更新OSSCredentialProvider credentialProvider =new OSSAuthCredentialsProvider(P_STSSERVER);//該配置類如果不設置,會有默認配置,具體可看該類ClientConfiguration conf =new ClientConfiguration();conf.setConnectionTimeout(15 *1000);// 連接超時,默認15秒conf.setSocketTimeout(15 *1000);// socket超時,默認15秒conf.setMaxConcurrentRequest(5);// 最大并發請求數,默認5個conf.setMaxErrorRetry(2);// 失敗后最大重試次數,默認2次oss =new OSSClient(context,P_ENDPOINT, credentialProvider);if (simpleDateFormat==null){simpleDateFormat =new SimpleDateFormat("yyyyMMdd");}}/*** 上傳圖片 上傳文件** @param context application上下文對象* @param ossUpCallback 成功的回調* @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() {@Overridepublic void onProgress(PutObjectRequest request,long currentSize,long totalSize) {ossUpCallback.inProgress(currentSize, totalSize);}});oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {@Overridepublic 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();// }}@Overridepublic void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {ossUpCallback.successImg(null);}});}/*** 上傳圖片 上傳流** @param context application上下文對象* @param ossUpCallback 成功的回調* @param img_name 上傳到oss后的文件名稱,圖片要記得帶后綴 如:.jpg* @param imgbyte 圖片的byte數組*/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() {@Overridepublic void onProgress(PutObjectRequest request,long currentSize,long totalSize) {ossUpCallback.inProgress(currentSize, totalSize);}});oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {@Overridepublic void onSuccess(PutObjectRequest request, PutObjectResult result) {Log.e("MyOSSUtils","------getRequestId:" + result.getRequestId());ossUpCallback.successImg(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+img_name));}@Overridepublic void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {ossUpCallback.successImg(null);}});}/*** 上傳視頻** @param context application上下文對象* @param ossUpCallback 成功的回調* @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() {@Overridepublic void onProgress(PutObjectRequest request,long currentSize,long totalSize) {ossUpCallback.inProgress(currentSize, totalSize);}});oss.asyncPutObject(putObjectRequest,new OSSCompletedCallback() {@Overridepublic void onSuccess(PutObjectRequest request, PutObjectResult result) {ossUpCallback.successVideo(oss.presignPublicObjectURL(P_BUCKETNAME,simpleDateFormat.format(data)+"/"+video_name));}@Overridepublic 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);}}

現在你們看到的結果是完美的,可是不知它的過程有多么痛苦;接下來闡述幾個坑:

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

2、當服務端要求存到某一個文件夾中的時候,一定是"文件夾名字 / 文件名" 開始和結尾一定一定不要帶 "/"。

3、OSS官方沒有給出文件批量上傳的方法,OSS官方沒有給出文件批量上傳的方法,OSS官方沒有給出文件批量上傳的方法。重要的事情要說三遍。

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

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

這里我沒有做一個eg,因為其實官網的文檔寫的還是不錯的,我覺得你要了解一個SDK一定要先看看API,然后才看工具類。這樣你會特別明了。



作者:楊阿陽阿陽
鏈接:https://www.jianshu.com/p/6a5b47ca2b37
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

總結

以上是生活随笔為你收集整理的Android端使用阿里OSS上传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。