七牛上传图片使用服务端uploadToken

This commit is contained in:
zu
2021-06-11 18:54:38 +08:00
parent 18c30b43eb
commit 86e5e820b8
3 changed files with 68 additions and 140 deletions

View File

@@ -86,33 +86,6 @@ public class XChatConstants {
*/ */
public static final String AGORA_KEY = "04d48cdbfd4547b3933a59e7acb0ae55"; //已更换 public static final String AGORA_KEY = "04d48cdbfd4547b3933a59e7acb0ae55"; //已更换
/**
* 七牛 access_url
*/
public static final String QINIU_ACCESS_URL_DEBUG = "http://image.uat.zhongjialx.com/";//已更换
public static final String QINIU_ACCESS_URL_RELEASE = "https://image.zhongjialx.com/";//已更换
/**
* 七牛 access_bucket(RELEASE)
*/
public static final String QINIU_ACCESS_BUCKET_RELEASE = "accompnay-image";//已更换
/**
* 七牛 access_bucket(DEBUG)
*/
public static final String QINIU_ACCESS_BUCKET_DEBUG = "accompany-image-dev";//已更换
/**
* 七牛 access_key
*/
public static final String QINIU_ACCESS_KEY = "7c9eC45DhG3qVtyRXuQe17SZfEmELLtGK2umzTc1";//已更换
/**
* 七牛 secret_key
*/
public static final String QINIU_SECRET_KEY = "t3sAMF3u6kFXJ9PCs3YxRzsu-ZjB03vL3aUAOVpk";//已更换
/** /**
* 阿里云日志空间名字 * 阿里云日志空间名字
*/ */

View File

@@ -2,28 +2,23 @@ package com.yizhuan.xchat_android_core.file;
import android.text.TextUtils; import android.text.TextUtils;
import com.netease.nim.uikit.common.util.file.FileUtil;
import com.netease.nim.uikit.common.util.log.LogUtil; import com.netease.nim.uikit.common.util.log.LogUtil;
import com.qiniu.android.common.FixedZone; import com.qiniu.android.common.FixedZone;
import com.qiniu.android.storage.Configuration; import com.qiniu.android.storage.Configuration;
import com.qiniu.android.storage.UploadManager; import com.qiniu.android.storage.UploadManager;
import com.qiniu.android.utils.UrlSafeBase64;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.Env;
import com.yizhuan.xchat_android_core.base.BaseModel; import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.community.bean.DynamicMedia; import com.yizhuan.xchat_android_core.community.bean.DynamicMedia;
import com.yizhuan.xchat_android_core.exception.ErrorThrowable; import com.yizhuan.xchat_android_core.exception.ErrorThrowable;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_library.net.rxnet.RxNet;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.File; import java.io.File;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import io.reactivex.Single; import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers; import retrofit2.http.GET;
public class FileModel extends BaseModel implements IFileModel { public class FileModel extends BaseModel implements IFileModel {
@@ -43,52 +38,33 @@ public class FileModel extends BaseModel implements IFileModel {
} }
private UploadManager uploadManager; private UploadManager uploadManager;
public static final String accessUrl = Env.isDebug() ? XChatConstants.QINIU_ACCESS_URL_DEBUG : XChatConstants.QINIU_ACCESS_URL_RELEASE; private final Api api = RxNet.create(Api.class);
public static final String accessKey = XChatConstants.QINIU_ACCESS_KEY;
public static final String secretKey = XChatConstants.QINIU_SECRET_KEY;
public static final String picprocessing = "?imageslim";
public static final String BUCKET = Env.isDebug() ? XChatConstants.QINIU_ACCESS_BUCKET_DEBUG : XChatConstants.QINIU_ACCESS_BUCKET_RELEASE;
@Override @Override
public Single<String> uploadFile(String path) { public Single<String> uploadFile(String path) {
File file; File file;
if (TextUtils.isEmpty(path) || !((file = new File(path)).exists())) { if (TextUtils.isEmpty(path) || !((file = new File(path)).exists())) {
return Single.error(new ErrorThrowable(path + " 为空或者该文件不存在!")); return Single.error(new ErrorThrowable(path + " 为空或者该文件不存在!"));
} }
File finalFile = file; File finalFile = file;
return Single.create(singleEmitter -> { return api.getUploadToken()
try { .compose(RxHelper.handleSchedulers())
// 1 构造上传策略 .compose(RxHelper.handleBeanData())
JSONObject json = new JSONObject(); .flatMap(uploadToken -> Single.create(singleEmitter ->
long deadline = System.currentTimeMillis() / 1000 + 3600; uploadManager.put(finalFile, uploadToken.getKey(), uploadToken.getToken(),
// 有效时间为一个小时 (key, info, response) -> {
json.put("deadline", deadline); if (info.isOK()) {
json.put("scope", BUCKET); try {
String encodedPutPolicy = UrlSafeBase64.encodeToString(json.toString().getBytes()); String imgUrl = response.getString("path");
byte[] sign = HmacSHA1Encrypt(encodedPutPolicy, secretKey); singleEmitter.onSuccess(imgUrl);
String encodedSign = UrlSafeBase64.encodeToString(sign); } catch (Exception e) {
String uploadToken = accessKey + ':' + encodedSign + ':' + encodedPutPolicy; singleEmitter.onError(e);
}
uploadManager.put(finalFile, FileUtil.getFileNameFromPath(path), uploadToken, } else {
(key, info, response) -> { singleEmitter.onError(new Throwable(info.error));
if (info.isOK()) { }
try { }, null)));
String imgName = response.getString("key");
singleEmitter.onSuccess(accessUrl + imgName + picprocessing);
} catch (Exception e) {
singleEmitter.onError(e);
}
} else {
singleEmitter.onError(new Throwable(info.error));
}
}, null);
} catch (Exception e) {
singleEmitter.onError(e);
}
});
} }
@Override @Override
@@ -102,51 +78,31 @@ public class FileModel extends BaseModel implements IFileModel {
if (TextUtils.isEmpty(path) || !((file = new File(path)).exists())) { if (TextUtils.isEmpty(path) || !((file = new File(path)).exists())) {
return Single.error(new ErrorThrowable(path + " 为空或者该文件不存在!")); return Single.error(new ErrorThrowable(path + " 为空或者该文件不存在!"));
} }
File finalFile = file; File finalFile = file;
Single<DynamicMedia> single = Single.create(singleEmitter -> { return api.getUploadToken()
try { .compose(RxHelper.handleSchedulers())
// 1 构造上传策略 .compose(RxHelper.handleBeanData())
JSONObject json = new JSONObject(); .flatMap(uploadToken -> Single.create(singleEmitter ->
long deadline = System.currentTimeMillis() / 1000 + 3600; uploadManager.put(finalFile, uploadToken.getKey(), uploadToken.getToken(),
// 有效时间为一个小时 (key, info, response) -> {
json.put("deadline", deadline); if (info.isOK()) {
json.put("scope", BUCKET); try {
//在这里返回宽高和图片格式 LogUtil.print("上传成功");
json.put("returnBody", LogUtil.print(response);
"{\"key\":\"$(key)\",\"hash\":\"$(etag)\"," + DynamicMedia media = responseToMeia(response);
"\"w\":\"$(imageInfo.width)\",\"h\":\"$(imageInfo.height)\"," + if (media != null) {
"\"format\":\"$(imageInfo.format)\"}"); singleEmitter.onSuccess(media);
String encodedPutPolicy = UrlSafeBase64.encodeToString(json.toString().getBytes()); return;
byte[] sign = HmacSHA1Encrypt(encodedPutPolicy, secretKey); }
String encodedSign = UrlSafeBase64.encodeToString(sign); } catch (Exception e) {
String uploadToken = accessKey + ':' + encodedSign + ':' + encodedPutPolicy; e.printStackTrace();
}
uploadManager.put(finalFile, TextUtils.isEmpty(qiniuName) ? null : qiniuName, uploadToken, singleEmitter.onError(new Throwable("qiniu json error"));
(key, info, response) -> { } else {
LogUtil.print(info); singleEmitter.onError(new Throwable(info.error));
if (info.isOK()) {
try {
LogUtil.print("上传成功");
LogUtil.print(response);
DynamicMedia media = responseToMeia(response);
if (media != null) {
singleEmitter.onSuccess(media);
return;
} }
} catch (Exception e) { }, null)));
e.printStackTrace();
}
singleEmitter.onError(new Throwable("qiniu json error"));
} else {
singleEmitter.onError(new Throwable(info.error));
}
}, null);
} catch (Exception e) {
singleEmitter.onError(e);
}
});
return single.observeOn(AndroidSchedulers.mainThread());
} }
@@ -155,33 +111,11 @@ public class FileModel extends BaseModel implements IFileModel {
return null; return null;
} }
/**
* 使用 HMAC-SHA1 签名方法对encryptText进行签名
*
* @param encryptText 被签名的字符串
* @param encryptKey 密钥
* @return
* @throws Exception
*/
public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey)
throws Exception {
byte[] data = encryptKey.getBytes("UTF-8");
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance("HmacSHA1");
// 用给定密钥初始化 Mac 对象
mac.init(secretKey);
byte[] text = encryptText.getBytes("UTF-8");
// 完成 Mac 操作
return mac.doFinal(text);
}
private DynamicMedia responseToMeia(JSONObject response) { private DynamicMedia responseToMeia(JSONObject response) {
DynamicMedia media = new DynamicMedia(); DynamicMedia media = new DynamicMedia();
try { try {
String imgName = response.getString("key"); String imgNamePath = response.getString("path");
media.setResUrl(accessUrl + imgName + picprocessing); media.setResUrl(imgNamePath);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
return null; return null;
@@ -196,4 +130,16 @@ public class FileModel extends BaseModel implements IFileModel {
LogUtil.print("七牛上传", media); LogUtil.print("七牛上传", media);
return media; return media;
} }
interface Api {
/**
* 获取钱包
*
* @return
*/
@GET("/qiniu/upload/getUploadToken")
Single<ServiceResult<UploadToken>> getUploadToken();
}
} }

View File

@@ -0,0 +1,9 @@
package com.yizhuan.xchat_android_core.file;
import lombok.Data;
@Data
public class UploadToken {
private String key;
private String token;
}