OssUtil.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.qlm.oss;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.aliyun.oss.OSS;
  4. import com.aliyun.oss.OSSClientBuilder;
  5. import com.aliyun.oss.model.PutObjectRequest;
  6. import com.jfinal.kit.LogKit;
  7. import com.jfinal.upload.UploadFile;
  8. import java.io.File;
  9. import java.io.InputStream;
  10. import java.util.Date;
  11. import java.util.UUID;
  12. /**
  13. * @program: yunpingtai
  14. * @ClassName: OssUtil
  15. * @description: TODO
  16. * @author: 吴英健
  17. * @create: 2025-07-09 10:50
  18. * @Version 1.0
  19. **/
  20. public class OssUtil {
  21. /**
  22. * 上传文件到OSS
  23. * @param uploadFile JFinal上传的文件对象
  24. * @param folder OSS上的文件夹路径,如 "images/"
  25. * @return 上传后的完整URL
  26. * @throws RuntimeException 上传失败时抛出异常
  27. */
  28. public static String upload(UploadFile uploadFile) {
  29. // 验证文件
  30. validateFile(uploadFile);
  31. File file = uploadFile.getFile();
  32. String originalFilename = uploadFile.getOriginalFileName();
  33. String fileExt = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
  34. // 生成新的文件名
  35. String newFileName = UUID.randomUUID().toString().replace("-", "") + fileExt;
  36. // OSS文件路径
  37. String ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + newFileName;
  38. // 创建OSS客户端
  39. OSS ossClient = new OSSClientBuilder().build(
  40. OssConfig.ENDPOINT,
  41. OssConfig.ACCESS_KEY_ID,
  42. OssConfig.ACCESS_KEY_SECRET
  43. );
  44. try {
  45. // 上传文件
  46. PutObjectRequest putObjectRequest = new PutObjectRequest(
  47. OssConfig.BUCKET_NAME,
  48. ossPath,
  49. file
  50. );
  51. ossClient.putObject(putObjectRequest);
  52. // 返回完整URL
  53. return OssConfig.DOMAIN + "/" + ossPath;
  54. } catch (Exception e) {
  55. LogKit.error("OSS文件上传失败", e);
  56. throw new RuntimeException("文件上传失败: " + e.getMessage());
  57. } finally {
  58. // 关闭OSS客户端
  59. if (ossClient != null) {
  60. ossClient.shutdown();
  61. }
  62. // 删除临时文件
  63. if (file != null && file.exists()) {
  64. file.delete();
  65. }
  66. }
  67. }
  68. /**
  69. * 通过InputStream上传文件到OSS
  70. * @param inputStream 文件输入流
  71. * @param filename 文件名
  72. * @return 上传后的完整URL
  73. * @throws RuntimeException 上传失败时抛出异常
  74. */
  75. public static String upload(InputStream inputStream, String filename) {
  76. // 验证文件名
  77. if (filename == null || filename.isEmpty()) {
  78. throw new RuntimeException("文件名不能为空");
  79. }
  80. String fileExt = filename.substring(filename.lastIndexOf(".")).toLowerCase();
  81. // 验证文件类型
  82. boolean allowed = false;
  83. for (String ext : OssConfig.ALLOWED_TYPES) {
  84. if (ext.trim().equalsIgnoreCase(fileExt)) {
  85. allowed = true;
  86. break;
  87. }
  88. }
  89. if (!allowed) {
  90. throw new RuntimeException("不支持的文件类型,仅支持: " + String.join(", ", OssConfig.ALLOWED_TYPES));
  91. }
  92. //不是zip包的情况下
  93. String ossPath = "";
  94. if (!filename.endsWith(".zip")) {
  95. // 生成新的文件名
  96. String newFileName = UUID.randomUUID().toString().replace("-", "") + fileExt;
  97. // OSS文件路径
  98. ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + newFileName;
  99. }else {
  100. ossPath = OssConfig.MKDIR + DateUtil.format(new Date(), "yyyyMMdd") + "/" + filename;
  101. }
  102. // 创建OSS客户端
  103. OSS ossClient = new OSSClientBuilder().build(
  104. OssConfig.ENDPOINT,
  105. OssConfig.ACCESS_KEY_ID,
  106. OssConfig.ACCESS_KEY_SECRET
  107. );
  108. try {
  109. // 通过InputStream上传文件
  110. PutObjectRequest putObjectRequest = new PutObjectRequest(
  111. OssConfig.BUCKET_NAME,
  112. ossPath,
  113. inputStream
  114. );
  115. ossClient.putObject(putObjectRequest);
  116. // 返回完整URL
  117. return OssConfig.DOMAIN + "/" + ossPath;
  118. } catch (Exception e) {
  119. LogKit.error("OSS文件上传失败", e);
  120. throw new RuntimeException("文件上传失败: " + e.getMessage());
  121. } finally {
  122. // 关闭OSS客户端
  123. if (ossClient != null) {
  124. ossClient.shutdown();
  125. }
  126. // 关闭输入流
  127. if (inputStream != null) {
  128. try {
  129. inputStream.close();
  130. } catch (Exception e) {
  131. LogKit.error("关闭输入流失败", e);
  132. }
  133. }
  134. }
  135. }
  136. /**
  137. * 验证上传文件
  138. */
  139. private static void validateFile(UploadFile uploadFile) {
  140. if (uploadFile == null) {
  141. throw new RuntimeException("请选择要上传的文件");
  142. }
  143. String originalFilename = uploadFile.getOriginalFileName();
  144. if (originalFilename == null || originalFilename.isEmpty()) {
  145. throw new RuntimeException("文件名不能为空");
  146. }
  147. // 检查文件扩展名
  148. String fileExt = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
  149. boolean allowed = false;
  150. for (String ext : OssConfig.ALLOWED_TYPES) {
  151. if (ext.trim().equalsIgnoreCase(fileExt)) {
  152. allowed = true;
  153. break;
  154. }
  155. }
  156. if (!allowed) {
  157. throw new RuntimeException("不支持的文件类型,仅支持: " + String.join(", ", OssConfig.ALLOWED_TYPES));
  158. }
  159. // 检查文件大小
  160. File file = uploadFile.getFile();
  161. if (file.length() > OssConfig.MAX_SIZE) {
  162. throw new RuntimeException("文件大小不能超过 " + (OssConfig.MAX_SIZE / 1024 / 1024) + "MB");
  163. }
  164. }
  165. }