package com.ruoyi.web.qiniu; import com.google.gson.Gson; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.storage.model.FileInfo; import com.qiniu.util.Auth; import com.qiniu.util.StringMap; import com.qiniu.util.UrlSafeBase64; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class QiNiuUtil { /** * 上传本地文件 * @param localFilePath 本地文件完整路径 * @param key 文件云端存储的名称 * @param override 是否覆盖同名同位置文件 * @return */ public static boolean upload(String localFilePath, String key, boolean override){ //构造一个带指定Zone对象的配置类 Configuration cfg = new Configuration(QiNiuConfig.getInstance().getZone()); //...其他参数参考类注释 UploadManager uploadManager = new UploadManager(cfg); //...生成上传凭证,然后准备上传 Auth auth = Auth.create(QiNiuConfig.getInstance().getAccessKey(), QiNiuConfig.getInstance().getSecretKey()); String upToken; if(override){ upToken = auth.uploadToken(QiNiuConfig.getInstance().getBucket(), key);//覆盖上传凭证 }else{ upToken = auth.uploadToken(QiNiuConfig.getInstance().getBucket()); } try { Response response = uploadManager.put(localFilePath, key, upToken); //解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(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; } } /** * 上传Base64图片 * @param l 图片没经过base64处理的原图字节大小,获取文件大小的时候,切记要通过文件流的方式获取。而不是通过图片标签然后转换后获取。 * @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(QiNiuConfig.getInstance().getBucket(), key);//覆盖上传凭证 }else{ upToken = auth.uploadToken(QiNiuConfig.getInstance().getBucket()); } String url = "http://upload.qiniup.com/putb64/" + l+"/key/"+ UrlSafeBase64.encodeToString(key); //非华东空间需要根据注意事项 1 修改上传域名 RequestBody rb = RequestBody.create(null, file64); Request request = new Request.Builder(). url(url). addHeader("Content-Type", "application/octet-stream") .addHeader("Authorization", "UpToken " + upToken) .post(rb).build(); //System.out.println(request.headers()); OkHttpClient client = new OkHttpClient(); okhttp3.Response response = client.newCall(request).execute(); //System.out.println(response); return response.isSuccessful(); } /** * 获取文件访问地址 * @param fileName 文件云端存储的名称 * @return * @throws UnsupportedEncodingException */ public static String fileUrl(String fileName) throws UnsupportedEncodingException { String[] parts = fileName.split("/"); StringBuilder encoded = new StringBuilder(); for (String part : parts) { if (encoded.length() > 0) { encoded.append('/'); } encoded.append(URLEncoder.encode(part, "utf-8").replace("+", "%20")); } String domain = QiNiuConfig.getInstance().getDomainOfBucket(); if (!domain.startsWith("http://") && !domain.startsWith("https://")) { domain = "https://" + domain; } String publicUrl = String.format("%s/%s", domain.replaceAll("/$", ""), encoded); Auth auth = getAuth(); long expireInSeconds = QiNiuConfig.getInstance().getExpireInSeconds(); if(-1 == expireInSeconds){ return auth.privateDownloadUrl(publicUrl); } return auth.privateDownloadUrl(publicUrl, expireInSeconds); } /** * 上传MultipartFile * @param file * @param key * @param override * @return * @throws IOException */ public static boolean uploadMultipartFile(MultipartFile file, String key, boolean override) { //构造一个带指定Zone对象的配置类 Configuration cfg = new Configuration(QiNiuConfig.getInstance().getZone()); //...其他参数参考类注释 UploadManager uploadManager = new UploadManager(cfg); //把文件转化为字节数组 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(QiNiuConfig.getInstance().getBucket(), key);//覆盖上传凭证 }else{ upToken = auth.uploadToken(QiNiuConfig.getInstance().getBucket()); } //默认上传接口回复对象 DefaultPutRet putRet; //进行上传操作,传入文件的字节数组,文件名,上传空间,得到回复对象 Response response = uploadManager.put(uploadBytes, key, upToken); putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); System.out.println(putRet.key);//key 文件名 System.out.println(putRet.hash);//hash 七牛返回的文件存储的地址,可以使用这个地址加七牛给你提供的前缀访问到这个视频。 return true; }catch (QiniuException e){ e.printStackTrace(); return false; }catch (IOException e) { e.printStackTrace(); return false; } } public static Auth getAuth(){ Auth auth = Auth.create(QiNiuConfig.getInstance().getAccessKey(), QiNiuConfig.getInstance().getSecretKey()); return auth; } /** 生成只允许上传指定任务截图的短期凭证。 */ public static String createTaskImageUploadToken(String key, int expiresSeconds, long fileSizeLimit) { StringMap policy = new StringMap(); policy.put("insertOnly", 1); policy.put("fsizeLimit", fileSizeLimit); policy.put("mimeLimit", "image/jpeg;image/png;image/webp"); return getAuth().uploadToken(QiNiuConfig.getInstance().getBucket(), key, expiresSeconds, policy); } /** 判断七牛对象是否真实存在。 */ public static boolean exists(String key) { Configuration cfg = new Configuration(QiNiuConfig.getInstance().getZone()); BucketManager bucketManager = new BucketManager(getAuth(), cfg); try { FileInfo info = bucketManager.stat(QiNiuConfig.getInstance().getBucket(), key); return info != null && info.fsize > 0; } catch (QiniuException ex) { return false; } } /** * 删除文件 * @param key */ public static boolean delete(String key){ Configuration cfg = new Configuration(QiNiuConfig.getInstance().getZone()); Auth auth = getAuth(); BucketManager bucketManager = new BucketManager(auth, cfg); try { bucketManager.delete(QiNiuConfig.getInstance().getBucket(), key); return true; } catch (QiniuException ex) { if (ex.code() == 612) { return true; } //如果遇到异常,说明删除失败 System.err.println(ex.code()); System.err.println(ex.response.toString()); return false; } } }