6371baa15f59261757f6b42423e0b9c5e3548898.svn-base 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. package org.jeecg.common.util.oss;
  2. import com.aliyun.oss.ClientConfiguration;
  3. import com.aliyun.oss.OSSClient;
  4. import com.aliyun.oss.common.auth.DefaultCredentialProvider;
  5. import com.aliyun.oss.model.CannedAccessControlList;
  6. import com.aliyun.oss.model.OSSObject;
  7. import com.aliyun.oss.model.PutObjectResult;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.apache.tomcat.util.http.fileupload.FileItemStream;
  10. import org.jeecg.common.util.CommonUtils;
  11. import org.jeecg.common.util.filter.FileTypeFilter;
  12. import org.jeecg.common.util.filter.StrAttackFilter;
  13. import org.jeecg.common.util.oConvertUtils;
  14. import org.springframework.web.multipart.MultipartFile;
  15. import java.io.BufferedInputStream;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.net.URL;
  19. import java.net.URLDecoder;
  20. import java.util.Date;
  21. import java.util.UUID;
  22. /**
  23. * @Description: 阿里云 oss 上传工具类(高依赖版)
  24. * @Date: 2019/5/10
  25. */
  26. @Slf4j
  27. public class OssBootUtil {
  28. private static String endPoint;
  29. private static String accessKeyId;
  30. private static String accessKeySecret;
  31. private static String bucketName;
  32. private static String staticDomain;
  33. public static void setEndPoint(String endPoint) {
  34. OssBootUtil.endPoint = endPoint;
  35. }
  36. public static void setAccessKeyId(String accessKeyId) {
  37. OssBootUtil.accessKeyId = accessKeyId;
  38. }
  39. public static void setAccessKeySecret(String accessKeySecret) {
  40. OssBootUtil.accessKeySecret = accessKeySecret;
  41. }
  42. public static void setBucketName(String bucketName) {
  43. OssBootUtil.bucketName = bucketName;
  44. }
  45. public static void setStaticDomain(String staticDomain) {
  46. OssBootUtil.staticDomain = staticDomain;
  47. }
  48. public static String getStaticDomain() {
  49. return staticDomain;
  50. }
  51. public static String getEndPoint() {
  52. return endPoint;
  53. }
  54. public static String getAccessKeyId() {
  55. return accessKeyId;
  56. }
  57. public static String getAccessKeySecret() {
  58. return accessKeySecret;
  59. }
  60. public static String getBucketName() {
  61. return bucketName;
  62. }
  63. public static OSSClient getOssClient() {
  64. return ossClient;
  65. }
  66. /**
  67. * oss 工具客户端
  68. */
  69. private static OSSClient ossClient = null;
  70. /**
  71. * 上传文件至阿里云 OSS
  72. * 文件上传成功,返回文件完整访问路径
  73. * 文件上传失败,返回 null
  74. *
  75. * @param file 待上传文件
  76. * @param fileDir 文件保存目录
  77. * @return oss 中的相对文件路径
  78. */
  79. public static String upload(MultipartFile file, String fileDir,String customBucket) {
  80. String FILE_URL = null;
  81. initOSS(endPoint, accessKeyId, accessKeySecret);
  82. StringBuilder fileUrl = new StringBuilder();
  83. String newBucket = bucketName;
  84. if(oConvertUtils.isNotEmpty(customBucket)){
  85. newBucket = customBucket;
  86. }
  87. try {
  88. //判断桶是否存在,不存在则创建桶
  89. if(!ossClient.doesBucketExist(newBucket)){
  90. ossClient.createBucket(newBucket);
  91. }
  92. // 获取文件名
  93. String orgName = file.getOriginalFilename();
  94. if("" == orgName){
  95. orgName=file.getName();
  96. }
  97. //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
  98. FileTypeFilter.fileTypeFilter(file);
  99. //update-end-author:liusq date:20210809 for: 过滤上传文件类型
  100. orgName = CommonUtils.getFileName(orgName);
  101. String fileName = orgName.indexOf(".")==-1
  102. ?orgName + "_" + System.currentTimeMillis()
  103. :orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."));
  104. if (!fileDir.endsWith("/")) {
  105. fileDir = fileDir.concat("/");
  106. }
  107. //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
  108. fileDir=StrAttackFilter.filter(fileDir);
  109. //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
  110. fileUrl = fileUrl.append(fileDir + fileName);
  111. if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
  112. FILE_URL = staticDomain + "/" + fileUrl;
  113. } else {
  114. FILE_URL = "https://" + newBucket + "." + endPoint + "/" + fileUrl;
  115. }
  116. PutObjectResult result = ossClient.putObject(newBucket, fileUrl.toString(), file.getInputStream());
  117. // 设置权限(公开读)
  118. // ossClient.setBucketAcl(newBucket, CannedAccessControlList.PublicRead);
  119. if (result != null) {
  120. log.info("------OSS文件上传成功------" + fileUrl);
  121. }
  122. } catch (IOException e) {
  123. e.printStackTrace();
  124. return null;
  125. }catch (Exception e) {
  126. e.printStackTrace();
  127. return null;
  128. }
  129. return FILE_URL;
  130. }
  131. /**
  132. * 获取原始URL
  133. * @param url: 原始URL
  134. * @Return: java.lang.String
  135. */
  136. public static String getOriginalUrl(String url) {
  137. String originalDomain = "https://" + bucketName + "." + endPoint;
  138. if(url.indexOf(staticDomain)!=-1){
  139. url = url.replace(staticDomain,originalDomain);
  140. }
  141. return url;
  142. }
  143. /**
  144. * 文件上传
  145. * @param file
  146. * @param fileDir
  147. * @return
  148. */
  149. public static String upload(MultipartFile file, String fileDir) {
  150. return upload(file, fileDir,null);
  151. }
  152. /**
  153. * 上传文件至阿里云 OSS
  154. * 文件上传成功,返回文件完整访问路径
  155. * 文件上传失败,返回 null
  156. *
  157. * @param file 待上传文件
  158. * @param fileDir 文件保存目录
  159. * @return oss 中的相对文件路径
  160. */
  161. public static String upload(FileItemStream file, String fileDir) {
  162. String FILE_URL = null;
  163. initOSS(endPoint, accessKeyId, accessKeySecret);
  164. StringBuilder fileUrl = new StringBuilder();
  165. try {
  166. String suffix = file.getName().substring(file.getName().lastIndexOf('.'));
  167. String fileName = UUID.randomUUID().toString().replace("-", "") + suffix;
  168. if (!fileDir.endsWith("/")) {
  169. fileDir = fileDir.concat("/");
  170. }
  171. fileDir = StrAttackFilter.filter(fileDir);
  172. fileUrl = fileUrl.append(fileDir + fileName);
  173. if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
  174. FILE_URL = staticDomain + "/" + fileUrl;
  175. } else {
  176. FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
  177. }
  178. PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(), file.openStream());
  179. // 设置权限(公开读)
  180. ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
  181. if (result != null) {
  182. log.info("------OSS文件上传成功------" + fileUrl);
  183. }
  184. } catch (IOException e) {
  185. e.printStackTrace();
  186. return null;
  187. }
  188. return FILE_URL;
  189. }
  190. /**
  191. * 删除文件
  192. * @param url
  193. */
  194. public static void deleteUrl(String url) {
  195. deleteUrl(url,null);
  196. }
  197. /**
  198. * 删除文件
  199. * @param url
  200. */
  201. public static void deleteUrl(String url,String bucket) {
  202. String newBucket = bucketName;
  203. if(oConvertUtils.isNotEmpty(bucket)){
  204. newBucket = bucket;
  205. }
  206. String bucketUrl = "";
  207. if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
  208. bucketUrl = staticDomain + "/" ;
  209. } else {
  210. bucketUrl = "https://" + newBucket + "." + endPoint + "/";
  211. }
  212. url = url.replace(bucketUrl,"");
  213. ossClient.deleteObject(newBucket, url);
  214. }
  215. /**
  216. * 删除文件
  217. * @param fileName
  218. */
  219. public static void delete(String fileName) {
  220. ossClient.deleteObject(bucketName, fileName);
  221. }
  222. /**
  223. * 获取文件流
  224. * @param objectName
  225. * @param bucket
  226. * @return
  227. */
  228. public static InputStream getOssFile(String objectName,String bucket){
  229. InputStream inputStream = null;
  230. try{
  231. String newBucket = bucketName;
  232. if(oConvertUtils.isNotEmpty(bucket)){
  233. newBucket = bucket;
  234. }
  235. initOSS(endPoint, accessKeyId, accessKeySecret);
  236. OSSObject ossObject = ossClient.getObject(newBucket,objectName);
  237. inputStream = new BufferedInputStream(ossObject.getObjectContent());
  238. }catch (Exception e){
  239. log.info("文件获取失败" + e.getMessage());
  240. }
  241. return inputStream;
  242. }
  243. /**
  244. * 获取文件流
  245. * @param objectName
  246. * @return
  247. */
  248. public static InputStream getOssFile(String objectName){
  249. return getOssFile(objectName,null);
  250. }
  251. /**
  252. * 获取文件外链
  253. * @param bucketName
  254. * @param objectName
  255. * @param expires
  256. * @return
  257. */
  258. public static String getObjectURL(String bucketName, String objectName, Date expires) {
  259. initOSS(endPoint, accessKeyId, accessKeySecret);
  260. try{
  261. if(ossClient.doesObjectExist(bucketName,objectName)){
  262. URL url = ossClient.generatePresignedUrl(bucketName,objectName,expires);
  263. return URLDecoder.decode(url.toString(),"UTF-8");
  264. }
  265. }catch (Exception e){
  266. log.info("文件路径获取失败" + e.getMessage());
  267. }
  268. return null;
  269. }
  270. /**
  271. * 初始化 oss 客户端
  272. *
  273. * @return
  274. */
  275. private static OSSClient initOSS(String endpoint, String accessKeyId, String accessKeySecret) {
  276. if (ossClient == null) {
  277. ossClient = new OSSClient(endpoint,
  278. new DefaultCredentialProvider(accessKeyId, accessKeySecret),
  279. new ClientConfiguration());
  280. }
  281. return ossClient;
  282. }
  283. /**
  284. * 上传文件到oss
  285. * @param stream
  286. * @param relativePath
  287. * @return
  288. */
  289. public static String upload(InputStream stream, String relativePath) {
  290. String FILE_URL = null;
  291. String fileUrl = relativePath;
  292. initOSS(endPoint, accessKeyId, accessKeySecret);
  293. if (oConvertUtils.isNotEmpty(staticDomain) && staticDomain.toLowerCase().startsWith("http")) {
  294. FILE_URL = staticDomain + "/" + relativePath;
  295. } else {
  296. FILE_URL = "https://" + bucketName + "." + endPoint + "/" + fileUrl;
  297. }
  298. PutObjectResult result = ossClient.putObject(bucketName, fileUrl.toString(),stream);
  299. // 设置权限(公开读)
  300. ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
  301. if (result != null) {
  302. log.info("------OSS文件上传成功------" + fileUrl);
  303. }
  304. return FILE_URL;
  305. }
  306. }