引入依赖
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
上传base64时要注意两个地方:
- base64要去掉头部,也就是只发送逗号之后的部分。
- 上传域名每个地方都不一样。
华东空间使用 upload.qiniup.com
华北空间使用 upload-z1.qiniup.com
华南空间使用 upload-z2.qiniup.com
北美空间使用 upload-na0.qiniup.com
package com.wang.test.qiniu;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.UrlSafeBase64;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.URLEncoder;
/**
* 七牛工具类
* @author Spider Man
* @date 2023-02-08 16:49
*/
@Slf4j
public class QiNiuUtil {
private static final String accessKey = "xxx";
private static final String secretKey = "xxx";
private static final String bucket = "xxx";
// [{'zone0':'华东'}, {'zone1':'华北'},{'zone2':'华南'},{'zoneNa0':'北美'},{'zoneAs0':''}]
private static final Zone zone = Zone.zone1();
//外链默认域名
private static final String domainOfBucket = "xxx";
//# 链接过期时间,单位是秒,3600代表1小时,-1代表永不过期
private static final long expireInSeconds = -1;
/**
* 上传MultipartFile,返回url
*
* @param file
* @param key
* @param override
* @return
* @throws IOException
*/
public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(zone);
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
DefaultPutRet defaultPutRet = null;
//把文件转化为字节数组
InputStream is = null;
ByteArrayOutputStream bos = null;
try {
is = file.getInputStream();
bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = -1;
while ((len = is.read(b)) != -1) {
bos.write(b, 0, len);
}
byte[] uploadBytes = bos.toByteArray();
Auth auth = getAuth();
String upToken;
if (override) {
upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
} else {
upToken = auth.uploadToken(bucket);
}
//进行上传操作,传入文件的字节数组,文件名,上传空间,得到回复对象
Response response = uploadManager.put(uploadBytes, key, upToken);
defaultPutRet = JSONUtil.toBean(response.bodyString(), DefaultPutRet.class);
// System.out.println(putRet.key);//key 文件名
// System.out.println(putRet.hash);//hash 七牛返回的文件存储的地址,可以使用这个地址加七牛给你提供的前缀访问到这个视频。
} catch (IOException e) {
e.printStackTrace();
}
assert defaultPutRet != null;
//返回图片路径
return "http://"+domainOfBucket+"/"+defaultPutRet.key;
}
/**
* 上传Base64图片 注意,base64的头部要去掉,也就是说要逗号以后的数据
*
* @param l 文件大小。支持传入 -1 表示文件大小以 http request body 为准。
* @param file64 图片base64字符串
* @param key 文件云端存储的名称
* @param override 是否覆盖同名同位置文件
* @return
* @throws IOException
*/
public static boolean uploadBase64(int l, String file64, String key, boolean override) throws IOException {
Auth auth = getAuth();
String upToken;
if (override) {
upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
} else {
upToken = auth.uploadToken(bucket);
}
//注意:upload.qiniup.com 上传域名适用于华东空间
// 华北空间使用 upload-z1.qiniup.com
// 华南空间使用 upload-z2.qiniup.com
// 北美空间使用 upload-na0.qiniup.com
String url = "http://upload-z1.qiniup.com/putb64/" + l + "/key/" + UrlSafeBase64.encodeToString(key);
HttpRequest httpRequest = HttpRequest.post(url).header("Content-Type", "application/octet-stream")
.header("Authorization", "UpToken " + upToken)
.body(file64);
System.out.println(httpRequest.execute().body());
return httpRequest.execute().isOk();
}
/**
* 获取文件访问地址
*
* @param fileName 文件云端存储的名称
* @return
* @throws UnsupportedEncodingException
*/
public static String fileUrl(String fileName) throws UnsupportedEncodingException {
String encodedFileName = URLEncoder.encode(fileName, "utf-8");
String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
Auth auth = getAuth();
if (-1 == expireInSeconds) {
return auth.privateDownloadUrl(publicUrl);
}
return auth.privateDownloadUrl(publicUrl, expireInSeconds);
}
/**
* 上传本地文件
*
* @param localFilePath 本地文件完整路径
* @param key 文件云端存储的名称
* @param override 是否覆盖同名同位置文件
* @return
*/
public static boolean upload(String localFilePath, String key, boolean override) {
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(zone);
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
Auth auth = Auth.create(accessKey, secretKey);
String upToken;
if (override) {
upToken = auth.uploadToken(bucket, key);//覆盖上传凭证
} else {
upToken = auth.uploadToken(bucket);
}
try {
Response response = uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = JSONUtil.toBean(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
return true;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
return false;
}
return false;
}
}
public static Auth getAuth() {
return Auth.create(accessKey, secretKey);
}
}