OSSUtils.java 10 KB

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