AliUploadFileService.java 11.7 KB
package com.metroapp.forum;

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.alibaba.sdk.android.oss.model.ResumableUploadRequest;
import com.alibaba.sdk.android.oss.model.ResumableUploadResult;
import com.douwan.peacemetro.R;
import com.metroapp.MainApplication;
import com.metroapp.forum.listener.ActionCallbackListener;
import com.metroapp.utils.ToastUtils;
import com.metroapp.utils.UIUtil;
import com.metroapp.utils.XNHttpRequest2;
import com.xiniunet.api.internal.util.StringUtils;
import com.xiniunet.api.request.xntalk.FileCreateBindAttachRequest;
import com.xiniunet.api.request.xntalk.FileUploadAuthInfoGetRequest;
import com.xiniunet.api.response.xntalk.FileCreateBindAttachmentResponse;
import com.xiniunet.api.response.xntalk.FileUploadAuthInfoGetResponse;

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

public class AliUploadFileService {

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


    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.activity = 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(MainApplication._this, message);
        }
    }

    /**
     * 自己定义文件名称
     */
    private String fileName;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    /**
     * 简单上传
     * 上传文件第一步 获取验证信息
     *
     * @param filePath
     */
    public void uploadFile(String filePath, String passportId) {

        this.filePath = filePath;


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

        String filename = !StringUtils.isEmpty(getFileName())?getFileName():getFileName(filePath);
        FileUploadAuthInfoGetRequest request = new FileUploadAuthInfoGetRequest();
        request.setName(filename);
        XNHttpRequest2<FileUploadAuthInfoGetResponse> response = new XNHttpRequest2<>(null);
        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, filename, filePath);
                } else {
                    setListener(false, MainApplication._this.getString(R.string.data_send_fail));
                }
            } else {
                setListener(false, fileResponse.getErrors().get(0).getMessage());
            }
        } else {
            setListener(false, MainApplication._this.getString(R.string.data_send_fail));
        }
    }


    /**
     * 简单上传
     * 上传文件第二步--上传到阿里云服务器
     *
     * @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);
                }
            });
        }
        final OSS mOss = initOSS(keyId, secretId, token, endpoint);
        mOss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                final String url = mOss.presignPublicObjectURL(request.getBucketName(), request.getObjectKey());

                activity.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());
                }
            }
        });
    }

    /**
     * 断点上传
     * 上传文件第二步--上传到阿里云服务器
     */
    private void resumableUpload(String keyId, String secretId, String token, String endpoint, String mBucket, String object, String filePath) {
        ResumableUploadRequest request = new ResumableUploadRequest(mBucket, object, filePath);
        request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() {
            @Override
            public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) {
                int progress = (int) (100 * currentSize / totalSize);
//                mDisplayer.updateProgress(progress);
//                mDisplayer.displayInfo("上传进度: " + String.valueOf(progress) + "%");
            }
        });
        OSS mOss = initOSS(keyId, secretId, token, endpoint);
        mOss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() {
            @Override
            public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {
            }

            @Override
            public void onFailure(ResumableUploadRequest request, ClientException clientException, ServiceException serviceException) {

            }
        });
    }

    /**
     * 上传文件第三步 将阿里云返回的图片地址上传到自己的服务器
     *
     * @param url          阿里云返回的图片地址
     * @param type;
     * @param businessType 业务类型
     * @param businessId   业务ID
     */
    public void bindAttachment(String url,
                               String type,
                               String businessType,
                               Long businessId,
                               long passportId,
                               ActionCallbackListener<String> listener) {

        this.listener = listener;
        if (url == null) {
            setListener(false, MainApplication._this.getString(R.string.data_send_fail));
            return;
        }

        FileCreateBindAttachRequest bindRequest = new FileCreateBindAttachRequest();
        bindRequest.setName(getFileName(url));
        bindRequest.setStoragePath(url);
        bindRequest.setExtension(getExtension(url));
        bindRequest.setBusinessId(businessId);
        bindRequest.setSize(0L);
        bindRequest.setBusinessType(businessType);
        bindRequest.setType(type);
        bindRequest.setSourceType("NORMAL");
        XNHttpRequest2<FileCreateBindAttachmentResponse> xnBindResponse = new XNHttpRequest2<>(null);
        xnBindResponse.post(bindRequest, passportId);
        FileCreateBindAttachmentResponse bindRespose = xnBindResponse.getResponse();
        if (null != bindRespose) {
            if (!bindRespose.hasError()) {
                setListener(true, MainApplication._this.getString(R.string.file_upload_success));
            } else {
                setListener(false, bindRespose.getErrors().get(0).getMessage());
            }
        } else {
            setListener(false, MainApplication._this.getString(R.string.data_send_fail));
        }
    }

    /**
     * 初始化oss
     *
     * @param keyId
     * @param secretId
     * @param token
     * @param endpoint
     * @return
     */
    public static OSS initOSS(String keyId, String secretId, String token, String endpoint) {
        OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(keyId, secretId, token);
        OSS oss = new OSSClient(MainApplication._this, endpoint, credentialProvider);
        return oss;
    }

    /**
     * 获取文件名称 带后缀
     *
     * @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
    }


}