OSSUtils.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package cn.com.ctop.common.utils;
  2. import com.aliyun.oss.OSSClient;
  3. import com.aliyun.oss.model.Bucket;
  4. import com.aliyun.oss.model.OSSObject;
  5. import com.aliyun.oss.model.ObjectMetadata;
  6. import com.aliyun.oss.model.PutObjectResult;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Value;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.PropertySource;
  12. import java.io.ByteArrayInputStream;
  13. import java.io.File;
  14. import java.io.FileInputStream;
  15. import java.io.InputStream;
  16. @Configuration
  17. @PropertySource("classpath:config.properties")
  18. public class OSSUtils {
  19. private static Logger logger = LoggerFactory.getLogger(OSSUtils.class);
  20. /**
  21. * 阿里云API的密钥Access Key ID
  22. */
  23. private static String accessKeyId;
  24. /**
  25. * 阿里云API的密钥Access Key Secret
  26. */
  27. private static String accessKeySecret;
  28. /**
  29. * 阿里云API的内或外网域名
  30. */
  31. private static String endpoint;
  32. /**
  33. * 阿里云API的bucket名称
  34. */
  35. private static String bucketName;
  36. /**
  37. * 阿里云API的文件夹名称
  38. */
  39. private static String folder;
  40. /**
  41. * 获取阿里云OSS客户端对象
  42. *
  43. * @return ossClient
  44. */
  45. public static OSSClient getOSSClient() {
  46. return new OSSClient(endpoint, accessKeyId, accessKeySecret);
  47. }
  48. /**
  49. * 创建存储空间
  50. *
  51. * @param ossClient OSS连接
  52. * @param bucketName 存储空间
  53. * @return
  54. */
  55. public static String createBucketName(OSSClient ossClient, String bucketName) {
  56. // 存储空间
  57. final String bucketNames = bucketName;
  58. if (!ossClient.doesBucketExist(bucketName)) {
  59. // 创建存储空间
  60. Bucket bucket = ossClient.createBucket(bucketName);
  61. logger.info("创建存储空间成功");
  62. return bucket.getName();
  63. }
  64. return bucketNames;
  65. }
  66. /**
  67. * 删除存储空间buckName
  68. *
  69. * @param ossClient oss对象
  70. * @param bucketName 存储空间
  71. */
  72. public static void deleteBucket(OSSClient ossClient, String bucketName) {
  73. ossClient.deleteBucket(bucketName);
  74. logger.info("删除" + bucketName + "Bucket成功");
  75. }
  76. /**
  77. * 创建模拟文件夹
  78. *
  79. * @param ossClient oss连接
  80. * @param bucketName 存储空间
  81. * @param folder 模拟文件夹名如"qj_nanjing/"
  82. * @return 文件夹名
  83. */
  84. public static String createFolder(OSSClient ossClient, String bucketName, String folder) {
  85. // 文件夹名
  86. final String keySuffixWithSlash = folder;
  87. // 判断文件夹是否存在,不存在则创建
  88. if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {
  89. // 创建文件夹
  90. ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
  91. logger.info("创建文件夹成功");
  92. // 得到文件夹名
  93. OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);
  94. String fileDir = object.getKey();
  95. return fileDir;
  96. }
  97. return keySuffixWithSlash;
  98. }
  99. /**
  100. * 根据key删除OSS服务器上的文件
  101. *
  102. * @param ossClient oss连接
  103. * @param bucketName 存储空间
  104. * @param folder 模拟文件夹名 如"qj_nanjing/"
  105. * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
  106. */
  107. public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key) {
  108. ossClient.deleteObject(bucketName, folder + key);
  109. logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");
  110. }
  111. /**
  112. * 上传图片至OSS
  113. *
  114. * @param ossClient oss连接
  115. * @param file 上传文件(文件全路径如:D:\\image\\cake.jpg)
  116. * @param bucketName 存储空间
  117. * @param folder 模拟文件夹名 如"qj_nanjing/"
  118. * @return String 返回的唯一MD5数字签名
  119. */
  120. public static String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) {
  121. String resultStr = null;
  122. try {
  123. // 以输入流的形式上传文件
  124. InputStream is = new FileInputStream(file);
  125. // 文件名
  126. String fileName = file.getName();
  127. // 文件大小
  128. Long fileSize = file.length();
  129. // 创建上传Object的Metadata
  130. ObjectMetadata metadata = new ObjectMetadata();
  131. // 上传的文件的长度
  132. metadata.setContentLength(is.available());
  133. // 指定该Object被下载时的网页的缓存行为
  134. metadata.setCacheControl("no-cache");
  135. // 指定该Object下设置Header
  136. metadata.setHeader("Pragma", "no-cache");
  137. // 指定该Object被下载时的内容编码格式
  138. metadata.setContentEncoding("utf-8");
  139. // 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
  140. // 如果没有扩展名则填默认值application/octet-stream
  141. metadata.setContentType(getContentType(fileName));
  142. // 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
  143. metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
  144. // 上传文件 (上传文件流的形式)
  145. PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata);
  146. // 解析结果
  147. resultStr = putResult.getETag();
  148. } catch (Exception e) {
  149. e.printStackTrace();
  150. logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
  151. }
  152. return resultStr;
  153. }
  154. /**
  155. * 通过文件名判断并获取OSS服务文件上传时文件的contentType
  156. *
  157. * @param fileName 文件名
  158. * @return 文件的contentType
  159. */
  160. public static String getContentType(String fileName) {
  161. // 文件的后缀名
  162. String fileExtension = fileName.substring(fileName.lastIndexOf("."));
  163. if (".bmp".equalsIgnoreCase(fileExtension)) {
  164. return "image/bmp";
  165. }
  166. if (".gif".equalsIgnoreCase(fileExtension)) {
  167. return "image/gif";
  168. }
  169. if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)
  170. || ".png".equalsIgnoreCase(fileExtension)) {
  171. return "image/jpeg";
  172. }
  173. if (".png".equalsIgnoreCase(fileExtension)) {
  174. return "image/png";
  175. }
  176. if (".html".equalsIgnoreCase(fileExtension)) {
  177. return "text/html";
  178. }
  179. if (".txt".equalsIgnoreCase(fileExtension)) {
  180. return "text/plain";
  181. }
  182. if (".vsd".equalsIgnoreCase(fileExtension)) {
  183. return "application/vnd.visio";
  184. }
  185. if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
  186. return "application/vnd.ms-powerpoint";
  187. }
  188. if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
  189. return "application/msword";
  190. }
  191. if (".xml".equalsIgnoreCase(fileExtension)) {
  192. return "text/xml";
  193. }
  194. // 默认返回类型
  195. return "";
  196. }
  197. @Value("${aliyun.accessKeyId}")
  198. public void setAccessKeyId(String accessKeyId) {
  199. OSSUtils.accessKeyId = accessKeyId;
  200. }
  201. @Value("${aliyun.accessKeySecret}")
  202. public void setAccessKeySecret(String accessKeySecret) {
  203. OSSUtils.accessKeySecret = accessKeySecret;
  204. }
  205. @Value("${aliyun.oss.endpoint}")
  206. public void setEndpoint(String endpoint) {
  207. OSSUtils.endpoint = endpoint;
  208. }
  209. @Value("${aliyun.oss.bucketName}")
  210. public void setBucketName(String bucketName) {
  211. OSSUtils.bucketName = bucketName;
  212. }
  213. @Value("${aliyun.oss.folder}")
  214. public void setFolder(String folder) {
  215. OSSUtils.folder = folder;
  216. }
  217. }