AliUploadFileService.java 7.84 KB
package com.metroapp.utils;

import android.app.Activity;

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.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider;
import com.alibaba.sdk.android.oss.model.OSSRequest;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;
import com.xiniunet.api.request.xntalk.FileUploadAuthInfoGetRequest;
import com.xiniunet.api.response.xntalk.FileUploadAuthInfoGetResponse;


/**
 * Created by mingming on 12/3/18.
 * 阿里云上传文件
 */

public class AliUploadFileService {

    private Activity mContext;
    private String filePath;
    private Long passportId;
    private boolean needDialog;
    /****上传结果回调*****/
    private ActionCallbackListener<String> listener;
    /****阿里云上传进度回调****/
    private onProgressListener progressListener;

    public interface ActionCallbackListener<T> {
        /**
         * 成功时调用
         *
         * @param data 返回的数据
         */
        public void onSuccess(T data);

        /**
         * 失败时调用
         *
         * @param errorCode 错误码
         * @param message   错误信息
         */
        public void onFailure(String errorCode, String message);
    }


    public void setListenerCallback(ActionCallbackListener<String> listener){
        this.listener = listener;
    }

    public void setProgressCallback(onProgressListener progressListener){
        this.progressListener = progressListener;
    }
    public AliUploadFileService(Activity context, boolean needDialog) {
        this.needDialog =  needDialog;
        this.mContext = context;
    }

    private interface onProgressListener{
        void onProgress(int progress);
    }

    private void setListener(boolean isSuccess,String message){
        if (needDialog){
            UIUtil.dismissDlg();
        }
        if (listener != null){
            if (isSuccess){
                listener.onSuccess(message);
            }else {
                listener.onFailure("",message);
            }
        }else {
            ToastUtils.showToast(mContext.getApplicationContext(),message);
        }
    }
    /**
     * 简单上传
     * 上传文件第一步 获取验证信息
     * @param filePath
     */
    public  void uploadFile(String filePath,String passportId){
        this.filePath = filePath;


        if (filePath ==null || filePath.isEmpty()){
            setListener(false,"获取文件路径出错");
            return;
        }
        if (needDialog){
            UIUtil.showWaitDialog(mContext);
        }

        FileUploadAuthInfoGetRequest request = new FileUploadAuthInfoGetRequest();
        request.setName(getFileName(filePath));
        XNHttpRequest2<FileUploadAuthInfoGetResponse> response = new XNHttpRequest2<>(null);
        //974110603784622080l
        if (passportId == null){
            passportId = "0";
        }

        response.post(request,Long.valueOf(passportId));
        FileUploadAuthInfoGetResponse fileResponse = response.getResponse();
        if (null != fileResponse ){
            if ( !fileResponse.hasError()){
                if (fileResponse.getInfo()!=null){
                    String token = fileResponse.getSecurityToken();
                    String endpoint = fileResponse.getInfo().getEndpoint();
                    String mBucket = fileResponse.getInfo().getBucket();
                    String  keyId = fileResponse.getAccessKeyId();
                    String secretId = fileResponse.getAccessKeySecret();
                    simpleUpload(keyId,secretId,token,endpoint,mBucket,getFileName(filePath),filePath);
                }else {
                    setListener(false,"上传失败");
                }
            }else {
                setListener(false,fileResponse.getErrors().get(0).getMessage());
            }
        }else {
            setListener(false, "上传失败");
        }
    }


    /**
     *  简单上传
     *  上传文件第二步--上传到阿里云服务器
     * @param object
     * @param filePath
     */
    private   void simpleUpload(String  keyId,String secretId,String token,String endpoint, String mBucket,String object,String filePath){

        if (object.equals("")) {
            return;
        }
        java.io.File file = new java.io.File(filePath);
        if (!file.exists()) {
            setListener(false,"获取文件路径出错");
            return;
        }
        // 构造上传请求
        PutObjectRequest put = new PutObjectRequest(mBucket, object, filePath);
        put.setCRC64(OSSRequest.CRC64Config.YES);
        // 异步上传时可以设置进度回调
        if (progressListener !=null){
            put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
                @Override
                public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
                    int progress = (int) (100 * currentSize / totalSize);
                    progressListener.onProgress(progress);
                }
            });
        }
        OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(keyId, secretId, token);
        final OSS mOss = new OSSClient(mContext.getApplication(), endpoint, credentialProvider);
        mOss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                final  String url =   mOss.presignPublicObjectURL(request.getBucketName(), request.getObjectKey());
                System.out.println("====>alionSuccess"+url);
                mContext.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        setListener(true,url);
                    }
                });



            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
                // 请求异常
                if (clientExcepion != null) {//本地异常如网络异常等
                    setListener(false,clientExcepion.toString());
                }
                if (serviceException != null) { // 服务异常
                    setListener(false, serviceException.toString());
                }
            }
        });
    }


    /**
     * 获取文件名称 带后缀
     * @param filePath
     * @return
     */
    public  static String getFileName(String filePath){

        int start=filePath.lastIndexOf("/");
        if(start!=-1 ){
            return filePath.substring(start+1);
        }else{
            return filePath;
        }
    }

    /**
     * 获取文件后缀名
     * @param filePath
     * @return
     */
    public static  String getExtension(String filePath){
        int end=filePath.lastIndexOf(".");
        if (end>0){
            return filePath.substring(end);
        }else {
            return "";
        }
    }


    /**
     * 文件类型必须为以下中的值,不然会报服务不可用
     */
    public enum FileTypeEnum {
        /**
         * 文档
         */
        DOCUMENT,

        /**
         * 压缩
         */
        COMPRESS,

        /**
         * 图片
         */
        IMAGE,

        /**
         * 视频
         */
        VEDIO,

        /**
         * 音频
         */
        AUDIO,

        /**
         * 应用
         */
        APPLICATION,

        /**
         * 其他
         */
        OTHER
    }




}