• Java 七牛云OSS 上传文件,删除图片,刷新CDN


    1. package com.ruoyi.common.utils.qiniu;
    2. import com.alibaba.fastjson2.JSONObject;
    3. import com.google.gson.Gson;
    4. import com.qiniu.cdn.CdnManager;
    5. import com.qiniu.cdn.CdnResult;
    6. import com.qiniu.common.Zone;
    7. import com.qiniu.storage.BucketManager;
    8. import com.qiniu.storage.Configuration;
    9. import com.qiniu.storage.Region;
    10. import com.qiniu.storage.model.DefaultPutRet;
    11. import com.qiniu.storage.model.FileInfo;
    12. import com.qiniu.storage.persistent.FileRecorder;
    13. import com.ruoyi.common.utils.StringUtils;
    14. import com.ruoyi.common.utils.file.FileUtils;
    15. import com.ruoyi.common.utils.uuid.UUIDUtil;
    16. import org.slf4j.Logger;
    17. import org.slf4j.LoggerFactory;
    18. import com.qiniu.common.QiniuException;
    19. import com.qiniu.http.Response;
    20. import com.qiniu.storage.UploadManager;
    21. import com.qiniu.util.Auth;
    22. import org.springframework.web.multipart.MultipartFile;
    23. import sun.misc.BASE64Decoder;
    24. import sun.misc.BASE64Encoder;
    25. import javax.crypto.Mac;
    26. import javax.imageio.ImageIO;
    27. import javax.servlet.http.HttpServletResponse;
    28. import java.awt.image.BufferedImage;
    29. import java.io.*;
    30. import java.net.URL;
    31. import java.net.URLConnection;
    32. import java.net.URLEncoder;
    33. import java.nio.file.Paths;
    34. import java.util.Arrays;
    35. import java.util.HashMap;
    36. import java.util.List;
    37. import java.util.Map;
    38. public class QiniuUtils {
    39. public static Logger logger = LoggerFactory.getLogger(QiniuUtils.class);
    40. /**
    41. * 描述:上传图片 (普通上传)
    42. * 禁止直接使用 请通过CommonUtils.uploadFileBefore()使用
    43. * @param file
    44. * @return
    45. */
    46. public static String uploadFile(MultipartFile file, JSONObject jsonObject){
    47. try {
    48. String ACCESS_KEY = jsonObject.getString("ACCESS_KEY");
    49. String SECRET_KEY = jsonObject.getString("SECRET_KEY");
    50. String BUCKET = jsonObject.getString("BUCKET");//桶名称
    51. String DOMAIN_URL = jsonObject.getString("DOMAIN_URL");//域名 例:http://www.baidu.com/
    52. String ZIP_PATH = jsonObject.getString("ZIP_PATH");//上传文件到七牛云指定路径
    53. //处理文件
    54. if(file.isEmpty()){
    55. return "";
    56. }
    57. //构造一个带指定Zone对象的配置类
    58. Configuration cfg = new Configuration(Zone.zone1());
    59. UploadManager uploadManager = new UploadManager(cfg);
    60. //默认不指定key的情况下,以文件内容的hash值作为文件名
    61. String key = ZIP_PATH + file.getOriginalFilename();//genKey(file.getOriginalFilename());
    62. logger.info("图片:" + key);
    63. //授权Token
    64. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    65. String upToken = auth.uploadToken(BUCKET);
    66. Response response = uploadManager.put(file.getInputStream(),key,upToken,null, null);
    67. //解析上传成功的结果
    68. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    69. System.out.println(putRet.key);
    70. System.out.println(putRet.hash);
    71. return DOMAIN_URL+key;
    72. } catch (RuntimeException ex) {
    73. ex.printStackTrace();
    74. throw new RuntimeException(ex.getMessage());
    75. } catch (Exception ex2) {
    76. ex2.printStackTrace();
    77. }finally{
    78. try {
    79. if(file.getInputStream() != null){
    80. file.getInputStream().close();
    81. }
    82. } catch (IOException e) {
    83. e.printStackTrace();
    84. }
    85. }
    86. return "";
    87. }
    88. /**
    89. * 描述:上传图片(普通上传)
    90. * 禁止直接使用 请通过CommonUtils.uploadFileBefore()使用
    91. * @param file
    92. * @return
    93. */
    94. public static String uploadFile(File file,JSONObject jsonObject){
    95. try {
    96. String ACCESS_KEY = jsonObject.getString("ACCESS_KEY");
    97. String SECRET_KEY = jsonObject.getString("SECRET_KEY");
    98. String BUCKET = jsonObject.getString("BUCKET");//桶名称
    99. String DOMAIN_URL = jsonObject.getString("DOMAIN_URL");//域名 例:http://www.baidu.com/
    100. String ZIP_PATH = jsonObject.getString("ZIP_PATH");//上传文件到七牛云指定路径
    101. //处理文件
    102. if(StringUtils.isEmpty(file.getPath())){
    103. return "";
    104. }
    105. //构造一个带指定Zone对象的配置类
    106. Configuration cfg = new Configuration(Zone.zone1());
    107. UploadManager uploadManager = new UploadManager(cfg);
    108. //默认不指定key的情况下,以文件内容的hash值作为文件名
    109. String key = ZIP_PATH + file.getName();//genKey(file.getName());
    110. logger.info("图片:" + key);
    111. //授权Token
    112. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    113. String upToken = auth.uploadToken(BUCKET);
    114. Response response = uploadManager.put(file,key,upToken);
    115. //解析上传成功的结果
    116. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    117. System.out.println(putRet.key);
    118. System.out.println(putRet.hash);
    119. return DOMAIN_URL+key;
    120. } catch (RuntimeException ex) {
    121. ex.printStackTrace();
    122. throw new RuntimeException(ex.getMessage());
    123. } catch (Exception ex2) {
    124. ex2.printStackTrace();
    125. }
    126. return "";
    127. }
    128. /**
    129. * 描述:删除图片
    130. * @param key
    131. */
    132. public static double delFile(String key,JSONObject jsonObject){
    133. double fileSize = 0;
    134. String ACCESS_KEY = jsonObject.getString("ACCESS_KEY");
    135. String SECRET_KEY = jsonObject.getString("SECRET_KEY");
    136. String BUCKET = jsonObject.getString("BUCKET");
    137. String DOMAIN_URL = jsonObject.getString("DOMAIN_URL");
    138. key = key.replace(DOMAIN_URL,"");
    139. //FileInfo fileInfo = getFileMags(key, jsonObject);
    140. //fileSize = (double)fileInfo.fsize/1048576;
    141. //构造一个带指定Zone对象的配置类
    142. Configuration cfg = new Configuration(Zone.zone1());
    143. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    144. BucketManager bucketManager = new BucketManager(auth, cfg);
    145. try {
    146. bucketManager.delete(BUCKET, key);
    147. } catch (QiniuException ex) {
    148. //如果遇到异常,说明删除失败
    149. System.err.println(ex.code());
    150. System.err.println(ex.response.toString());
    151. }
    152. return fileSize;
    153. }
    154. //获取图片存储空间
    155. public static double getFileSize(String keys, JSONObject jsonObject){
    156. if(StringUtils.isBlank(keys)){
    157. return 0;
    158. }
    159. String[] keyList = keys.split(",");
    160. double fileSize = 0;
    161. if(keyList != null && keyList.length > 0){
    162. for(String key:keyList){
    163. String[] nn = key.split("/");
    164. key = "image/" + nn[nn.length-1];
    165. FileInfo fileInfo = getFileMags(key, jsonObject);
    166. if(fileInfo != null && fileInfo.fsize > 0){
    167. fileSize += (double)fileInfo.fsize/1048576;
    168. }
    169. }
    170. }
    171. return fileSize;
    172. }
    173. /**
    174. * 下载对象文件
    175. * @param fileUrl
    176. * @param jsonObject
    177. * @param response
    178. */
    179. public static void downFile(String fileUrl, JSONObject jsonObject, HttpServletResponse response){
    180. String ACCESS_KEY = jsonObject.getString("ACCESS_KEY");
    181. String SECRET_KEY = jsonObject.getString("SECRET_KEY");
    182. String DOMAIN_URL = jsonObject.getString("DOMAIN_URL");
    183. int bytesum = 0;
    184. int byteread = 0;
    185. InputStream input = null;
    186. try{
    187. String end = fileUrl.substring(fileUrl.lastIndexOf("/")+1);
    188. String start = fileUrl.substring(0, fileUrl.lastIndexOf("/"));
    189. String domainOfBucket = DOMAIN_URL+start;
    190. String encodedFileName = URLEncoder.encode(end, "utf-8").replace("+", "%20");
    191. String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName);
    192. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    193. long expireInSeconds = 3600;//1小时,可以自定义链接过期时间
    194. String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds);
    195. String[] nn = fileUrl.split("/");
    196. String[] split = nn[nn.length-1].split("\\.");
    197. // path是指欲下载的文件的路径。
    198. URL url = new URL(finalUrl);
    199. URLConnection conn = url.openConnection();
    200. input = conn.getInputStream();
    201. response.reset();
    202. response.setContentType("text/html;charset=ISO8859-1");
    203. response.setContentType("bin");
    204. response.addHeader("Content-Disposition", "attachment; filename=\"" + new String(UUIDUtil.get16UUID().toString().getBytes("ISO8859-1"), "ISO8859-1") + "." + split[split.length-1] + "\"");
    205. byte[] buffer = new byte[1204];
    206. while ((byteread = input.read(buffer)) != -1) {
    207. bytesum += byteread;
    208. response.getOutputStream().write(buffer, 0, byteread);
    209. }
    210. }catch(Exception e){
    211. e.printStackTrace();
    212. }finally{
    213. try {
    214. if(input!=null){
    215. input.close();
    216. }
    217. } catch (IOException e) {
    218. // TODO Auto-generated catch block
    219. e.printStackTrace();
    220. }
    221. }
    222. }
    223. /**
    224. *
    225. * @param key 图片路径
    226. * @param jsonObject
    227. */
    228. public static void refreshUrls(String key,JSONObject jsonObject){
    229. String accessKey = jsonObject.getString("ACCESS_KEY");
    230. String secretKey = jsonObject.getString("SECRET_KEY");
    231. Auth auth = Auth.create(accessKey, secretKey);
    232. CdnManager c = new CdnManager(auth);
    233. //待刷新的链接列表
    234. String[] urls = new String[]{
    235. key
    236. //....
    237. };
    238. try {
    239. //单次方法调用刷新的链接不可以超过100个
    240. CdnResult.RefreshResult result = c.refreshUrls(urls);
    241. System.out.println(result.code);
    242. //获取其他的回复内容
    243. } catch (QiniuException e) {
    244. System.err.println(e.response.toString());
    245. }
    246. }
    247. /**
    248. * 描述:批量删除文件
    249. * @param ids
    250. */
    251. /*public static double batchDelFile(String ids){
    252. if(StringUtils.isBlank(ids)){
    253. return 0;
    254. }
    255. double fileSize = 0;
    256. //单次批量请求的文件数量不得超过1000
    257. String[] keyList = ids.split(",");
    258. List keys = new ArrayList();
    259. if(keyList != null && keyList.length > 0){
    260. for(String key:keyList){
    261. Map map = CommonUtils.getStorageBind(DictUtils.getDictValue("七牛云", "storage_type", "1"));
    262. String ACCESS_KEY = null;
    263. String SECRET_KEY = null;
    264. String BUCKET = null;
    265. if(map==null){
    266. ACCESS_KEY = config.ACCESS_KEY;
    267. SECRET_KEY = config.SECRET_KEY;
    268. BUCKET = config.BUCKET;
    269. }else{
    270. ACCESS_KEY = map.get("ACCESS_KEY");
    271. SECRET_KEY = map.get("SECRET_KEY");
    272. BUCKET = map.get("BUCKET");
    273. }
    274. FileInfo fileInfo = getFileMags(key, map);
    275. if(fileInfo != null && fileInfo.fsize > 0){
    276. fileSize += (double)fileInfo.fsize/1048576;
    277. keys.add(key);
    278. }
    279. }
    280. }
    281. if(keys != null && keys.size() > 0){
    282. Map map = CommonUtils.getStorageBind(DictUtils.getDictValue("七牛云", "storage_type", "1"));
    283. String ACCESS_KEY = null;
    284. String SECRET_KEY = null;
    285. String BUCKET = null;
    286. if(map==null){
    287. ACCESS_KEY = config.ACCESS_KEY;
    288. SECRET_KEY = config.SECRET_KEY;
    289. BUCKET = config.BUCKET;
    290. }else{
    291. ACCESS_KEY = map.get("ACCESS_KEY");
    292. SECRET_KEY = map.get("SECRET_KEY");
    293. BUCKET = map.get("BUCKET");
    294. }
    295. //构造一个带指定Zone对象的配置类
    296. Configuration cfg = new Configuration(Zone.zone1());
    297. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    298. BucketManager bucketManager = new BucketManager(auth, cfg);
    299. try {
    300. BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    301. batchOperations.addDeleteOp(BUCKET, keys.toArray(new String[keys.size()]));
    302. Response response = bucketManager.batch(batchOperations);
    303. BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    304. for (int i = 0; i < keys.size(); i++) {
    305. BatchStatus status = batchStatusList[i];
    306. String key = keys.get(i);
    307. System.out.print(key + "\t");
    308. if (status.code == 200) {
    309. System.out.println("delete success");
    310. } else {
    311. System.out.println(status.data.error);
    312. }
    313. }
    314. } catch (QiniuException ex) {
    315. System.err.println(ex.response.toString());
    316. }
    317. }
    318. return fileSize;
    319. }*/
    320. /**
    321. * 描述:生成七牛云Key 生成策略:fileName + fileType
    322. * @param fileName
    323. * @return
    324. * @since: 2017年10月14日 下午5:05:03
    325. */
    326. public static String genKey(String fileName){
    327. String fileType = fileName.substring(fileName.lastIndexOf("."), fileName.length());
    328. String name = UUIDUtil.get16UUID() + fileType;
    329. System.out.println(fileName+"----"+name);
    330. return name;
    331. }
    332. /**
    333. * 描述:格式转化
    334. * @param resourceId
    335. * @param ids
    336. * @return
    337. */
    338. public static Map handerMap(String resourceId,String ids){
    339. Map map = new HashMap();
    340. map.put("resourceId", StringUtils.isNoneBlank(resourceId) ? resourceId : "");
    341. List keyList = Arrays.asList(ids.split(","));
    342. map.put("keyList", keyList);
    343. return map;
    344. }
    345. /**
    346. * 将图片转换成base64格式进行存储
    347. * @return
    348. */
    349. public static String encodeToString(BufferedImage image, String type) throws IOException {
    350. String imageString = null;
    351. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    352. try {
    353. ImageIO.write(image, type, bos);
    354. byte[] imageBytes = bos.toByteArray();
    355. BASE64Encoder encoder = new BASE64Encoder();
    356. imageString = encoder.encode(imageBytes);
    357. bos.close();
    358. } catch (IOException e) {
    359. e.printStackTrace();
    360. }
    361. return imageString;
    362. }
    363. /**
    364. * 获取图片格式
    365. * @param params
    366. * @return
    367. */
    368. public static String getSuffixNameInfo(MultipartFile params){
    369. String result = "";
    370. // 图片后缀
    371. String suffixName = params.getOriginalFilename().substring(
    372. params.getOriginalFilename().lastIndexOf("."));
    373. if(suffixName.indexOf("png")>0){
    374. result = "png";
    375. }else if(suffixName.indexOf("jpg")>0){
    376. result = "jpg";
    377. }else if(suffixName.indexOf("jpeg")>0){
    378. result = "jpeg";
    379. }
    380. return result;
    381. }
    382. /**
    383. * base64 转MultipartFile
    384. * @param base64
    385. * @return
    386. */
    387. public static MultipartFile base64ToMultipart(String base64) {
    388. try {
    389. // 注意base64是否有头信息,如:data:image/jpeg;base64,。。。
    390. String[] baseStrs = base64.split(",");
    391. BASE64Decoder decoder = new BASE64Decoder();
    392. byte[] b = new byte[0];
    393. b = decoder.decodeBuffer(baseStrs[0]);
    394. for(int i = 0; i < b.length; ++i) {
    395. if (b[i] < 0) {
    396. b[i] += 256;
    397. }
    398. }
    399. return new BASE64DecodedMultipartFile(b, baseStrs[0]);
    400. } catch (IOException e) {
    401. e.printStackTrace();
    402. return null;
    403. }
    404. }
    405. //获取文件信息
    406. public static FileInfo getFileMags(String key, JSONObject jsonObject) {
    407. String ACCESS_KEY = jsonObject.getString("ACCESS_KEY");
    408. String SECRET_KEY = jsonObject.getString("SECRET_KEY");
    409. String BUCKET = jsonObject.getString("BUCKET");
    410. //构造一个带指定 Region 对象的配置类
    411. Configuration cfg = new Configuration(Zone.zone1());
    412. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    413. BucketManager bucketManager = new BucketManager(auth, cfg);
    414. FileInfo fileInfo = null;
    415. try {
    416. fileInfo = bucketManager.stat(BUCKET, key);
    417. System.out.println(fileInfo.hash);
    418. System.out.println(fileInfo.fsize);
    419. System.out.println(fileInfo.mimeType);
    420. System.out.println(fileInfo.putTime);
    421. } catch (QiniuException ex) {
    422. System.err.println(ex.response.toString());
    423. }
    424. return fileInfo;
    425. }
    426. /**
    427. * 分片式,断点上传文件到七牛云
    428. * @param jsonObject
    429. * @return
    430. * @throws Exception
    431. */
    432. public static String uploadStream(JSONObject jsonObject) throws Exception{
    433. String accessKey = jsonObject.getString("ACCESS_KEY");//ACCESS_KEY
    434. String secretKey = jsonObject.getString("SECRET_KEY");//SECRET_KEY
    435. String bucket = jsonObject.getString("BUCKET");//桶名称
    436. String DOMAIN_URL = jsonObject.getString("DOMAIN_URL");//域名 例:http://www.baidu.com/
    437. String ZIP_PATH = jsonObject.getString("ZIP_PATH");//上传文件到七牛云指定路径
    438. String localFilePath = jsonObject.getString("filePath");//需要上传文件的本地路径
    439. //构造一个带指定 Region 对象的配置类
    440. Configuration cfg = new Configuration(Region.huabei());
    441. cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
    442. cfg.resumableUploadMaxConcurrentTaskCount = 2; // 设置分片上传并发,1:采用同步上传;大于1:采用并发上传
    443. //...其他参数参考类注释
    444. //...生成上传凭证,然后准备上传
    445. //String accessKey = "your access key";
    446. //String secretKey = "your secret key";
    447. //String bucket = "your bucket name";
    448. //如果是Windows情况下,格式是 D:\\qiniu\\test.png
    449. //String localFilePath = "/home/qiniu/test.mp4";
    450. //默认不指定key的情况下,以文件内容的hash值作为文件名
    451. File file = new File(localFilePath);
    452. String key = ZIP_PATH + file.getName();//genKey(file.getOriginalFilename());
    453. logger.info("图片:" + key);
    454. //String key = null;
    455. Auth auth = Auth.create(accessKey, secretKey);
    456. String upToken = auth.uploadToken(bucket,key);
    457. String mm = System.getenv("java.io.tmpdir");//"C:\\Users\\yys\\AppData\\Local\\Temp\\";//
    458. String localTempDir = Paths.get(mm, bucket).toString();
    459. try {
    460. //设置断点续传文件进度保存目录
    461. FileRecorder fileRecorder = new FileRecorder(localTempDir);
    462. UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
    463. try {
    464. Response response = uploadManager.put(localFilePath, key, upToken);
    465. //解析上传成功的结果
    466. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    467. System.out.println(putRet.key);
    468. System.out.println(putRet.hash);
    469. return DOMAIN_URL + putRet.key;
    470. } catch (QiniuException ex) {
    471. Response r = ex.response;
    472. System.err.println(r.toString());
    473. try {
    474. System.err.println(r.bodyString());
    475. } catch (QiniuException ex2) {
    476. //ignore
    477. }
    478. }
    479. } catch (IOException ex) {
    480. ex.printStackTrace();
    481. }
    482. return null;
    483. }
    484. public static void main(String[] angs) throws Exception {
    485. JSONObject jsonObject = new JSONObject();
    486. jsonObject.put("ACCESS_KEY","123");
    487. jsonObject.put("SECRET_KEY","123");
    488. jsonObject.put("BUCKET","123");//同名称
    489. jsonObject.put("DOMAIN_URL","http://域名/");
    490.       jsonObject.put("filePath","C:\\Users\\yygs\\Desktop\\chengxu\\sdfg\\dtyhf\\fhj\\测试v1.2.3.zip");
    491. jsonObject.put("ZIP_PATH","home/fgh/edrtg/");//七牛云文件上传的指定路径
    492. uploadStream(jsonObject);
    493. }
    494. }

    maven  pom需要引入的jar

    1. com.qiniu
    2. qiniu-java-sdk
    3. [7.7.0, 7.10.99]
    4. com.squareup.okhttp3
    5. okhttp
    6. 3.14.2
    7. compile
    8. com.google.code.gson
    9. gson
    10. 2.8.5
    11. compile
    12. com.qiniu
    13. happy-dns-java
    14. 0.1.6
    15. test
    16. junit
    17. junit
    18. 4.12
    19. test

  • 相关阅读:
    Mybatis逆向工程实战:如何快速生成实体类、Mapper接口和配置文件
    如何自己实现一个丝滑的流程图绘制工具(九) 自定义连接线
    SpringBoot的数据库连接池
    Azure Data Factory(十)Data Flow 组件详解
    Mac环境下反编译工具的使用
    微软AI系列 如何使用微软及相关产品来实现 文字转语音
    推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
    使用platformio+arduino开发自定义板子STM32G070
    让开源数据开发平台助力提质增效!
    更新:股票量化投资:商用因子模型:EAP.industry.Portfolio
  • 原文地址:https://blog.csdn.net/yyongsheng/article/details/126902077