美文网首页
Android端使用阿里OSS上传

Android端使用阿里OSS上传

作者: 杨阿杨阿阳 | 来源:发表于2018-07-26 16:49 被阅读0次

    最近一直没更新博客,因为都写到了公司的wiki上,我觉得博客是有必要的,记录一下自己成长过程中的一点一滴吧。

    这节课,说一下阿里的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() {
    
    @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上下文对象
    
    * @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() {
    
    @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上下文对象
    
    * @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() {
    
    @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);
    
    }
    
    }
    

    现在你们看到的结果是完美的,可是不知它的过程有多么痛苦;接下来阐述几个坑:

    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,然后才看工具类。这样你会特别明了。

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

    相关文章

      网友评论

          本文标题:Android端使用阿里OSS上传

          本文链接:https://www.haomeiwen.com/subject/jpwbmftx.html