OssArchiveUtil.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package com.caimei.modules.archive.utils;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import com.aliyun.oss.model.CannedAccessControlList;
  5. import com.aliyun.oss.model.GetObjectRequest;
  6. import com.aliyun.oss.model.ObjectMetadata;
  7. import com.aliyun.oss.model.UploadFileRequest;
  8. import com.caimei.utils.StringUtils;
  9. import com.thinkgem.jeesite.common.config.Global;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import java.io.File;
  12. import java.io.IOException;
  13. import java.util.Date;
  14. import java.util.UUID;
  15. public class OssArchiveUtil {
  16. private static String endpoint = Global.getConfig("aliyun.endpoint");
  17. private static String accessKeyId = Global.getConfig("aliyun.accessKeyId");
  18. private static String accessKeySecret = Global.getConfig("aliyun.accessKeySecret");
  19. private static String privateBucket = Global.getConfig("aliyun.bucketName");
  20. private static String config = Global.getConfig("cm.config");
  21. public static String ossUpload(String fileName, String path, File file, String contentType, String contentDisposition) {
  22. String url = null;
  23. try {
  24. if ("product".equals(config)) {
  25. fileName = "prod/" + path + fileName;
  26. } else {
  27. fileName = config + "/" + path + fileName;
  28. }
  29. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  30. ObjectMetadata meta = new ObjectMetadata();
  31. meta.setContentType(contentType);
  32. meta.setObjectAcl(CannedAccessControlList.PublicRead);
  33. meta.setContentDisposition(StringUtils.isEmpty(contentDisposition) ? "inline" : contentDisposition);
  34. UploadFileRequest uploadFileRequest = new UploadFileRequest(privateBucket, fileName);
  35. // 指定上传的本地文件。
  36. uploadFileRequest.setUploadFile(file.toString());
  37. // 指定上传并发线程数,默认为1。
  38. uploadFileRequest.setTaskNum(10);
  39. // 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
  40. uploadFileRequest.setPartSize(1024 * 1024);
  41. // 开启断点续传,默认关闭。
  42. uploadFileRequest.setEnableCheckpoint(true);
  43. uploadFileRequest.setCheckpointFile(file.getAbsolutePath() + "uploadFile.ucp");
  44. // 文件的元数据。
  45. uploadFileRequest.setObjectMetadata(meta);
  46. // 设置上传成功回调,参数为Callback类型。
  47. //uploadFileRequest.setCallback("<yourCallbackEvent>");
  48. // 断点续传上传。
  49. ossClient.uploadFile(uploadFileRequest);
  50. // 有效期100年
  51. Date expiration = new Date(System.currentTimeMillis() + 60L * 60 * 24 * 365 * 100 * 1000);
  52. url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
  53. // 关闭OSSClient。
  54. ossClient.shutdown();
  55. } catch (Throwable e) {
  56. e.printStackTrace();
  57. }
  58. return url;
  59. }
  60. /**
  61. * 通过文件名判断并获取OSS服务文件上传时文件的contentType
  62. */
  63. public static String getContentType(String fileName) {
  64. String fileExtension = fileName.substring(fileName.lastIndexOf("."));
  65. if (".bmp".equalsIgnoreCase(fileExtension)) {
  66. return "image/bmp";
  67. }
  68. if (".gif".equalsIgnoreCase(fileExtension)) {
  69. return "image/gif";
  70. }
  71. if (".jpeg".equalsIgnoreCase(fileExtension)) {
  72. return "image/jpeg";
  73. }
  74. if (".jpg".equalsIgnoreCase(fileExtension)) {
  75. return "image/jpg";
  76. }
  77. if (".png".equalsIgnoreCase(fileExtension)) {
  78. return "image/png";
  79. }
  80. if (".html".equalsIgnoreCase(fileExtension)) {
  81. return "text/html";
  82. }
  83. if (".txt".equalsIgnoreCase(fileExtension)) {
  84. return "text/plain";
  85. }
  86. if (".vsd".equalsIgnoreCase(fileExtension)) {
  87. return "application/vnd.visio";
  88. }
  89. if (".ppt".equalsIgnoreCase(fileExtension) ) {
  90. return "application/vnd.ms-powerpoint";
  91. }
  92. if (".pptx".equalsIgnoreCase(fileExtension)) {
  93. return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
  94. }
  95. if (".doc".equalsIgnoreCase(fileExtension) ) {
  96. return "application/msword";
  97. }
  98. if ("docx".equalsIgnoreCase(fileExtension)) {
  99. return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  100. }
  101. if (".xml".equalsIgnoreCase(fileExtension)) {
  102. return "text/xml";
  103. }
  104. if (".mp4".equalsIgnoreCase(fileExtension)) {
  105. return "video/mp4";
  106. }
  107. if (".mp3".equalsIgnoreCase(fileExtension)) {
  108. return "audio/mp3";
  109. }
  110. if (".pdf".equalsIgnoreCase(fileExtension)) {
  111. return "application/pdf";
  112. }
  113. return "text/html";
  114. }
  115. public static void deleteFile(File... files) {
  116. for (File file : files) {
  117. //logger.info("File:[{}]",file.getAbsolutePath());
  118. if (file.exists()) {
  119. file.delete();
  120. }
  121. }
  122. }
  123. public static File ossUpload(MultipartFile file) throws IOException {
  124. // 获取文件名
  125. String fileName = file.getOriginalFilename();
  126. // 获取文件后缀
  127. String prefix = fileName.substring(fileName.lastIndexOf("."));
  128. // 用uuid作为文件名,防止生成的临时文件重复
  129. File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
  130. // MultipartFile to File
  131. file.transferTo(excelFile);
  132. //程序结束时,删除临时文件
  133. return excelFile;
  134. }
  135. /**
  136. * 授权生成签名URL临时访问
  137. *
  138. * @param fileName 文件名称
  139. */
  140. public static String getOssUrl(String path, String fileName) {
  141. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  142. // 设置URL过期时间为1个小时
  143. Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000);
  144. if ("product".equals(config)) {
  145. fileName = "prod/" + path + fileName;
  146. } else {
  147. fileName = config + "/" + path + fileName;
  148. }
  149. String url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
  150. // 关闭OSSClient。
  151. ossClient.shutdown();
  152. return url;
  153. }
  154. /**
  155. * oss单个文件删除
  156. *
  157. * @param fileName 文件名称或文件夹名称
  158. */
  159. public static void deleteSingleFile(String path, String fileName) {
  160. // 创建OSSClient实例。
  161. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  162. // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。
  163. // 如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
  164. if ("product".equals(config)) {
  165. fileName = "prod/" + path + fileName;
  166. } else {
  167. fileName = config + "/" + path + fileName;
  168. }
  169. ossClient.deleteObject(privateBucket, fileName);
  170. // 关闭OSSClient。
  171. ossClient.shutdown();
  172. }
  173. /**
  174. * oss单个文件下载
  175. */
  176. public static void downFile(String path, String ossName, String fileName) {
  177. // 创建OSSClient实例。
  178. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  179. // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
  180. if ("product".equals(config)) {
  181. ossName = "prod/" + path + ossName;
  182. } else {
  183. ossName = config + "/" + path + ossName;
  184. }
  185. ossClient.getObject(new GetObjectRequest(privateBucket, ossName), new File("./" + fileName));
  186. // 关闭OSSClient。
  187. ossClient.shutdown();
  188. }
  189. }