七牛上传图片工具类,方便大家使用

github 格式的在这

https://github.com/guaju/AdouLive/blob/master/app/src/main/java/com/guaju/adoulive/qiniu/QiniuUploadHelper.java

贴到这吧

import android.util.Log;

import com.guaju.adoulive.httputil.OkHttpHelper;
import com.orhanobut.logger.Logger;
import com.qiniu.android.common.FixedZone;
import com.qiniu.android.http.ResponseInfo;
import com.qiniu.android.storage.Configuration;
import com.qiniu.android.storage.UpCancellationSignal;
import com.qiniu.android.storage.UpCompletionHandler;
import com.qiniu.android.storage.UpProgressHandler;
import com.qiniu.android.storage.UploadManager;
import com.qiniu.android.storage.UploadOptions;
import com.qiniu.android.utils.UrlSafeBase64;

import org.json.JSONObject;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * Created by guaju on 2017/11/2.
 * 操作7牛的工具类
 *
 */

public class QiniuUploadHelper {

    private static String mSpaceName;
    private static String mSecretKey;
    private static String mAccessKey;


    private static boolean isCancelled=false;
    private static final String MAC_NAME = "HmacSHA1";
    private static final String ENCODING = "UTF-8";
    // static final  String SPACENAME="my-bucket";
//  static final String AccessKey="MY_ACCESS_KEY";
//  static final String SecretKey="MY_SECRET_KEY";
    private static UploadManager uploadManager;

    //初始化 uploadManager
    public  static void  init(String spaceName,String secretKey,String accessKey){
        mAccessKey=accessKey;
        mSecretKey=secretKey;
        mSpaceName=spaceName;

        Configuration config = new Configuration.Builder()
                .chunkSize(512 * 1024)        // 分片上传时,每片的大小。 默认256K
                .putThreshhold(1024 * 1024)   // 启用分片上传阀值。默认512K
                .connectTimeout(10)           // 链接超时。默认10秒
                .useHttps(true)               // 是否使用https上传域名
                .responseTimeout(60)          // 服务器响应超时。默认60秒
                .zone(FixedZone.zone0)        // 设置区域,指定不同区域的上传域名、备用域名、备用IP。
                .build();
        //重用uploadManager。一般地,只需要创建一个uploadManager对象
        uploadManager = new UploadManager(config);
    }
    //生成客户端?服务端传递图片的token值

    /**
     *
     * @param picName   图片名称,需要带图片后缀
     * @return
     */
    public static String calcToken(String picName) throws Exception {
        //1、构建上传策略
        String scope=mSpaceName+":"+picName;
        long deadline= (System.currentTimeMillis()+3000)/1000;
//        long deadline= 1451491200;
        //TokenBean.ReturnBody returnBody = new TokenBean.ReturnBody("$(fname)", "$(fsize)", "$(imageInfo.width)", "$(imageInfo.height)", "$(etag)");
        TokenBean tokenBean = new TokenBean(scope, deadline);
        //2、把上传策略转化成json
        String putPolicy = OkHttpHelper.getInstance().gson.toJson(tokenBean);
        //3、URL 安全的 Base64 编码
        String encodedPutPolicy = UrlSafeBase64.encodeToString(putPolicy.getBytes());
        //4、使用访问密钥(AK/SK)对上一步生成的待签名字符串计算HMAC-SHA1签名:
        byte[] sign = HmacSHA1Encrypt(encodedPutPolicy, mSecretKey);
        //5、对签名进行URL安全的Base64编码:
        String encodedSign = UrlSafeBase64.encodeToString(sign);
        //6、将访问密钥(AK/SK)、encodedSign 和 encodedPutPolicy 用英文符号 : 连接起来:
        String uploadToken =mAccessKey + ':' + encodedSign + ':' + encodedPutPolicy;
        return uploadToken;

    }
    /**
     * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
     *
     * @param encryptText 被签名的字符串
     * @param encryptKey  密钥
     * @return
     * @throws Exception
     */
    public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey)
            throws Exception {


        byte[] data = encryptKey.getBytes(ENCODING);
        // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
        // 生成一个指定 Mac 算法 的 Mac 对象
        Mac mac = Mac.getInstance(MAC_NAME);
        // 用给定密钥初始化 Mac 对象
        mac.init(secretKey);
        byte[] text = encryptText.getBytes(ENCODING);
        // 完成 Mac 操作
        return mac.doFinal(text);
    }

    /**
     *  简单的上传图片的方法
     * @param filePath  图片路径
     * @param picName   服务器上边图片的名称
     */
    public static void uploadPic(String filePath,String picName,UpCompletionHandler handler) throws Exception {
        String data =filePath;
        String key = picName;
        String token= calcToken(picName);
        uploadManager.put(data, key, token,
               handler, null);
    }

    /**
     * 可以显示图片上传进度的方法
     * @param filePath
     * @param picName
     * @param token
     */
    public  static void uploadPicWithProgress(String filePath,String picName,String token){
        uploadManager.put(filePath, picName, token,
                new UpCompletionHandler() {
                    @Override
                    public void complete(String key, ResponseInfo info, JSONObject res) {
                        //res包含hash、key等信息,具体字段取决于上传策略的设置
                        if(info.isOK()) {
                            Logger.i("qiniu", "Upload Success");
                        } else {
                            Logger.i("qiniu", "Upload Fail");
                            //如果失败,这里可以把info信息上报自己的服务器,便于后面分析上传错误原因
                        }
                        Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
                    }
                }, new UploadOptions(null,null, false,
                        new UpProgressHandler(){
                            public void progress(String key, double percent){
                                Log.i("qiniu", key + ": " + percent);
                            }
                        }, null));
    }

    /**
     *  可以显示进度还可以停止上传图片的方法
     * @param filePath
     * @param picName
     * @param token
     */
    public  static void uploadPicCanCancle(String filePath,String picName,String token){
        uploadManager.put(filePath, picName, token,
                new UpCompletionHandler() {
                    @Override
                    public void complete(String key, ResponseInfo info, JSONObject res) {
                        //res包含hash、key等信息,具体字段取决于上传策略的设置
                        if(info.isOK()) {
                            Logger.i("qiniu", "Upload Success");
                        } else {
                            Logger.i("qiniu", "Upload Fail");
                            //如果失败,这里可以把info信息上报自己的服务器,便于后面分析上传错误原因
                        }
                        Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
                    }
                }, new UploadOptions(null,null, false,
                        new UpProgressHandler(){
                            public void progress(String key, double percent){
                                Log.i("qiniu", key + ": " + percent);
                            }
                        }, new UpCancellationSignal(){
                    public boolean isCancelled(){
                        return isCancelled;
                    }
                }));
    }

    /**
     *
     * @param value 设置是否停止图片上传
     */
    public static void setCancle(boolean value){
        isCancelled=value;
    }
}
ok,调用的时候只需要调用该类中的

uploadPic(String filePath,String picName,UpCompletionHandler handler) 

方法即可

注意:如果网络状态太差的话,建议修改

long deadline= (System.currentTimeMillis()+3000)/1000;
这的图片存活时间,把上边的3000改成15000应该就能够应付了,不过还得看你们的真正实际需要,还有什么问题的话,可以评论

你可能感兴趣的:(七牛上传图片工具类,方便大家使用)