OSSUtils.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package com.caimei.utils;
  2. import com.aliyun.oss.HttpMethod;
  3. import com.aliyun.oss.OSS;
  4. import com.aliyun.oss.OSSClientBuilder;
  5. import com.aliyun.oss.model.*;
  6. import com.aliyuncs.DefaultAcsClient;
  7. import com.aliyuncs.IAcsClient;
  8. import com.aliyuncs.auth.sts.AssumeRoleRequest;
  9. import com.aliyuncs.auth.sts.AssumeRoleResponse;
  10. import com.aliyuncs.exceptions.ClientException;
  11. import com.aliyuncs.profile.DefaultProfile;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.web.multipart.MultipartFile;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.net.URL;
  19. import java.util.Date;
  20. import java.util.HashMap;
  21. import java.util.UUID;
  22. @Component
  23. public class OSSUtils {
  24. private static String endpoint;
  25. @Value("${aliyunConfig.endpoint}")
  26. public void setEndpoint(String endpoints) {
  27. endpoint = endpoints;
  28. }
  29. private static String accessKeyId;
  30. @Value("${aliyunConfig.accessKeyId}")
  31. public void setAccessKeyId(String accessKeyIds) {
  32. accessKeyId = accessKeyIds;
  33. }
  34. private static String accessKeySecret;
  35. @Value("${aliyunConfig.accessKeySecret}")
  36. public void setAccessKeySecret(String accessKeySecrets) {
  37. accessKeySecret = accessKeySecrets;
  38. }
  39. private static String privateBucket;
  40. @Value("${aliyunConfig.bucketName}")
  41. public void setPrivateBucket(String bucketName) {
  42. privateBucket = bucketName;
  43. }
  44. private static String active;
  45. @Value("${spring.profiles.active}")
  46. public void setActive(String actives) {
  47. active = actives;
  48. }
  49. public static HashMap<String, String> getToken() {
  50. //构建一个阿里云客户端,用于发起请求。
  51. //设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
  52. DefaultProfile profile = DefaultProfile.getProfile("oss-cn-shenzhen", accessKeyId, accessKeySecret);
  53. IAcsClient client = new DefaultAcsClient(profile);
  54. //构造请求,设置参数。
  55. AssumeRoleRequest request = new AssumeRoleRequest();
  56. request.setRegionId(endpoint);
  57. request.setRoleArn("acs:ram::1565565840178476:role/caimeitst");
  58. request.setRoleSessionName("TSTtest");
  59. AssumeRoleResponse response = null;
  60. try {
  61. response = client.getAcsResponse(request);
  62. } catch (ClientException e) {
  63. e.printStackTrace();
  64. }
  65. String requestId = response.getRequestId();
  66. String securityToken = response.getCredentials().getSecurityToken();
  67. String accessKeySecret = response.getCredentials().getAccessKeySecret();
  68. String accessKeyId = response.getCredentials().getAccessKeyId();
  69. HashMap<String, String> tokenMap = new HashMap<>(5);
  70. tokenMap.put("requestId", requestId);
  71. tokenMap.put("accessKeyId", accessKeyId);
  72. tokenMap.put("accessKeySecret", accessKeySecret);
  73. tokenMap.put("securityToken", securityToken);
  74. tokenMap.put("bucket", privateBucket);
  75. return tokenMap;
  76. }
  77. public static String ossUpload(String fileName, File file, String contentType, String contentDisposition) {
  78. String url = null;
  79. try {
  80. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  81. ObjectMetadata meta = new ObjectMetadata();
  82. meta.setObjectAcl(CannedAccessControlList.PublicRead);
  83. meta.setContentType(contentType);
  84. // 设置
  85. if (StringUtils.isNotEmpty(contentDisposition)) {
  86. meta.setContentDisposition(contentDisposition);
  87. }
  88. fileName = active + "/authFile/" + fileName;
  89. UploadFileRequest uploadFileRequest = new UploadFileRequest(privateBucket, fileName);
  90. // 指定上传的本地文件。
  91. uploadFileRequest.setUploadFile(file.toString());
  92. // 指定上传并发线程数,默认为1。
  93. uploadFileRequest.setTaskNum(10);
  94. // 指定上传的分片大小,范围为100KB~5GB,默认为文件大小/10000。
  95. uploadFileRequest.setPartSize(1024 * 1024);
  96. // 开启断点续传,默认关闭。
  97. uploadFileRequest.setEnableCheckpoint(true);
  98. uploadFileRequest.setCheckpointFile(file.getAbsolutePath() + "uploadFile.ucp");
  99. // 文件的元数据。
  100. uploadFileRequest.setObjectMetadata(meta);
  101. // 设置上传成功回调,参数为Callback类型。
  102. //uploadFileRequest.setCallback("<yourCallbackEvent>");
  103. // 断点续传上传。
  104. ossClient.uploadFile(uploadFileRequest);
  105. // 有效期100年
  106. Date expiration = new Date(System.currentTimeMillis() + 60L * 60 * 24 * 365 * 100 * 1000);
  107. url = ossClient.generatePresignedUrl(privateBucket, fileName, expiration).toString();
  108. /*GeneratePresignedUrlRequest request =
  109. new GeneratePresignedUrlRequest(privateBucket, fileName, HttpMethod.PUT);//设置为这个URL只支持PUT操作
  110. request.setExpiration(expiration);
  111. request.setContentType("application/octet-stream");
  112. url = ossClient.generatePresignedUrl(request).toString();*/
  113. // 关闭OSSClient。
  114. ossClient.shutdown();
  115. } catch (Throwable e) {
  116. e.printStackTrace();
  117. }
  118. return url;
  119. }
  120. /**
  121. * 通过文件名判断并获取OSS服务文件上传时文件的contentType
  122. */
  123. public static String getContentType(String fileName) {
  124. String fileExtension = fileName.substring(fileName.lastIndexOf("."));
  125. if (".bmp".equalsIgnoreCase(fileExtension)) {
  126. return "image/bmp";
  127. }
  128. if (".gif".equalsIgnoreCase(fileExtension)) {
  129. return "image/gif";
  130. }
  131. if (".jpeg".equalsIgnoreCase(fileExtension)) {
  132. return "image/jpeg";
  133. }
  134. if (".jpg".equalsIgnoreCase(fileExtension)) {
  135. return "image/jpg";
  136. }
  137. if (".png".equalsIgnoreCase(fileExtension)) {
  138. return "image/png";
  139. }
  140. if (".html".equalsIgnoreCase(fileExtension)) {
  141. return "text/html";
  142. }
  143. if (".txt".equalsIgnoreCase(fileExtension)) {
  144. return "text/plain";
  145. }
  146. if (".vsd".equalsIgnoreCase(fileExtension)) {
  147. return "application/vnd.visio";
  148. }
  149. if (".ppt".equalsIgnoreCase(fileExtension)) {
  150. return "application/vnd.ms-powerpoint";
  151. }
  152. if (".pptx".equalsIgnoreCase(fileExtension)) {
  153. return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
  154. }
  155. if (".doc".equalsIgnoreCase(fileExtension)) {
  156. return "application/msword";
  157. }
  158. if (".docx".equalsIgnoreCase(fileExtension)) {
  159. return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  160. }
  161. if (".xml".equalsIgnoreCase(fileExtension)) {
  162. return "text/xml";
  163. }
  164. if (".mp4".equalsIgnoreCase(fileExtension)) {
  165. return "video/mp4";
  166. }
  167. if (".mp3".equalsIgnoreCase(fileExtension)) {
  168. return "audio/mp3";
  169. }
  170. if (".pdf".equalsIgnoreCase(fileExtension)) {
  171. return "application/pdf";
  172. }
  173. if (".zip".equalsIgnoreCase(fileExtension)) {
  174. return "application/zip";
  175. }
  176. return "text/html";
  177. }
  178. public static void deleteFile(File... files) {
  179. for (File file : files) {
  180. //logger.info("File:[{}]",file.getAbsolutePath());
  181. if (file.exists()) {
  182. file.delete();
  183. }
  184. }
  185. }
  186. public static File ossUpload(MultipartFile file) throws IOException {
  187. // 获取文件名
  188. String fileName = file.getOriginalFilename();
  189. // 获取文件后缀
  190. String prefix = fileName.substring(fileName.lastIndexOf("."));
  191. // 用uuid作为文件名,防止生成的临时文件重复
  192. File excelFile = File.createTempFile(UUID.randomUUID().toString(), prefix);
  193. // MultipartFile to File
  194. file.transferTo(excelFile);
  195. //程序结束时,删除临时文件
  196. return excelFile;
  197. }
  198. /**
  199. * 授权生成签名URL临时访问
  200. *
  201. * @param fileName 文件名称
  202. */
  203. public static String getOssUrl(String fileName) {
  204. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  205. // 设置URL过期时间为1个小时
  206. Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000);
  207. String url = ossClient.generatePresignedUrl(privateBucket, active + "/authFile/" + fileName, expiration).toString();
  208. // 关闭OSSClient。
  209. ossClient.shutdown();
  210. return url;
  211. }
  212. /**
  213. * oss单个文件删除
  214. *
  215. * @param fileName 文件名称或文件夹名称
  216. */
  217. public static void deleteSingleFile(String fileName) {
  218. // 创建OSSClient实例。
  219. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  220. // 删除文件。如需删除文件夹,请将ObjectName设置为对应的文件夹名称。
  221. // 如果文件夹非空,则需要将文件夹下的所有object删除后才能删除该文件夹。
  222. ossClient.deleteObject(privateBucket, active + "/authFile/" + fileName);
  223. // 关闭OSSClient。
  224. ossClient.shutdown();
  225. }
  226. /**
  227. * oss单个文件下载
  228. */
  229. public static void downFile(String path, String ossName, String fileName) {
  230. // 创建OSSClient实例。
  231. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  232. // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
  233. String filePath = active + "/" + path + ossName;
  234. ossClient.getObject(new GetObjectRequest(privateBucket, filePath), new File("./" + fileName));
  235. // 关闭OSSClient。
  236. ossClient.shutdown();
  237. }
  238. public static void downFileByFilePath(String path, String ossName, String fileName) {
  239. // 创建OSSClient实例。
  240. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  241. // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
  242. String filePath = active + "/" + path + ossName;
  243. ossClient.getObject(new GetObjectRequest(privateBucket, filePath), new File(fileName));
  244. // 关闭OSSClient。
  245. ossClient.shutdown();
  246. }
  247. }