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上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Camera镜头相关知识整理
- 下一篇: MindManager使用说明