UploadToOssUtil.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package com.fdkankan.fusion.common.util;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.io.FileUtil;
  4. import com.aliyun.oss.OSSClient;
  5. import com.aliyun.oss.common.utils.BinaryUtil;
  6. import com.aliyun.oss.model.*;
  7. import com.fdkankan.fusion.response.FileInfoVo;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.apache.commons.io.FileUtils;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.ObjectUtils;
  15. import org.springframework.web.multipart.MultipartFile;
  16. import org.springframework.web.multipart.commons.CommonsMultipartFile;
  17. import java.io.*;
  18. import java.net.*;
  19. import java.util.*;
  20. import java.util.stream.Collectors;
  21. @Slf4j
  22. @Component
  23. public class UploadToOssUtil {
  24. @Value("${oss.point}")
  25. private String point;
  26. @Value("${oss.key}")
  27. private String key;
  28. @Value("${oss.secrey}")
  29. private String secrey;
  30. @Value("${oss.bucket:4dkankan}")
  31. private String bucket;
  32. @Value("${upload.type:oss}")
  33. private String type;
  34. @Value("${upload.query-path}")
  35. private String queryPath;
  36. @Autowired
  37. LocalToOssUtil localToOssUtil;
  38. /**
  39. * 获取文件内容-阿里云
  40. * @param objectName
  41. * @return
  42. */
  43. public boolean existKey(String objectName){
  44. //创建oss客户端
  45. if("local".equals(type)){
  46. return localToOssUtil.existKey(objectName);
  47. }
  48. OSSClient ossClient = new OSSClient(point, key, secrey);
  49. // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
  50. try{
  51. boolean exist = ossClient.doesObjectExist(bucket, objectName);
  52. return exist;
  53. }catch (Exception e){
  54. log.error("s4判断是否存在key异常,key=" + objectName, e);
  55. }finally {
  56. if(ossClient != null){
  57. ossClient.shutdown();
  58. }
  59. }
  60. return false;
  61. }
  62. /**
  63. * 从阿里云oss下载文件到本地
  64. * @param objectName 云端文件k地址
  65. * @param localPath 本地文件地址
  66. * @return
  67. */
  68. public boolean downFormAli(String objectName, String localPath){
  69. if("local".equals(type)){
  70. return localToOssUtil.downFormAli(objectName,localPath);
  71. }
  72. OSSClient ossClient = new OSSClient(point, key, secrey);
  73. try {
  74. com.aliyun.oss.model.GetObjectRequest request = new com.aliyun.oss.model.GetObjectRequest(bucket,objectName);
  75. File file = new File(localPath);
  76. if(!file.getParentFile().exists()){
  77. file.getParentFile().mkdirs();
  78. file = new File(localPath);
  79. }
  80. ossClient.getObject(request, file);
  81. return true;
  82. }catch (Exception e){
  83. log.error("阿里云oss文件下载失败,key=" + objectName, e);
  84. }finally {
  85. if(ossClient != null){
  86. ossClient.shutdown();
  87. }
  88. }
  89. return false;
  90. }
  91. public void uploadOss(String filePath, String key1){
  92. if("local".equals(type)){
  93. localToOssUtil.uploadOss(filePath,key1);
  94. return ;
  95. }
  96. OSSClient ossClient = new OSSClient(point, key, secrey);
  97. try {
  98. log.info("upload-to-oss:file-path:{},oss-path:{}",filePath,key1);
  99. File file = new File(filePath);
  100. if (!file.exists()) {
  101. log.info("upload-to-oss:file-path:{},oss-path:{},filePath不存在!",filePath,key1);
  102. return;
  103. }
  104. ObjectMetadata metadata = new ObjectMetadata();
  105. ossClient.putObject(bucket, key1, new File(filePath), metadata);
  106. } catch (Exception e) {
  107. log.info("upload-to-oss:error:file-path:{},key:{}",filePath,key1);
  108. } finally {
  109. ossClient.shutdown();
  110. }
  111. }
  112. public void delete(String objectName){
  113. if("local".equals(type)){
  114. localToOssUtil.delete(objectName);
  115. return ;
  116. }
  117. OSSClient ossClient = new OSSClient(point, key, secrey);
  118. try {
  119. ossClient.deleteObject(bucket, objectName);
  120. } catch (Exception e) {
  121. log.error("OSS删除文件失败,key=" + objectName);
  122. }finally {
  123. if(ossClient != null){
  124. ossClient.shutdown();
  125. }
  126. }
  127. }
  128. /**
  129. * 获得文件列表-阿里云
  130. * @return
  131. */
  132. public List<String> listKeysFromAli(String sourcePath) {
  133. if("local".equals(type)){
  134. return localToOssUtil.listKeysFromAli(sourcePath);
  135. }
  136. List<String> keyList = new ArrayList<>();
  137. OSSClient ossClient = new OSSClient(point, key, secrey);
  138. try {
  139. boolean flag = true;
  140. String nextMaker = null;
  141. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(this.bucket);
  142. //指定下一级文件
  143. listObjectsRequest.setPrefix(sourcePath);
  144. //设置分页的页容量
  145. listObjectsRequest.setMaxKeys(200);
  146. do
  147. {
  148. //获取下一页的起始点,它的下一项
  149. listObjectsRequest.setMarker(nextMaker);
  150. ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
  151. List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
  152. List<String> collect = objectSummaries.stream().map(summary -> {
  153. return summary.getKey();
  154. }).collect(Collectors.toList());
  155. if(CollUtil.isNotEmpty(collect)){
  156. keyList.addAll(collect);
  157. }
  158. nextMaker = objectListing.getNextMarker();
  159. //全部执行完后,为false
  160. flag = objectListing.isTruncated();
  161. } while (flag);
  162. }catch (Exception e){
  163. log.error("获取文件列表失败,path="+sourcePath, e);
  164. }finally {
  165. if(ossClient != null){
  166. ossClient.shutdown();
  167. }
  168. }
  169. ossClient.shutdown();
  170. return keyList;
  171. }
  172. /**
  173. * 获取文件内容-阿里云
  174. * @param objectName
  175. * @return
  176. */
  177. public String getObjectContent(String objectName){
  178. //创建oss客户端
  179. OSSClient ossClient = new OSSClient(point, key, secrey);
  180. InputStream objectContent = null;
  181. StringBuilder contentJson = new StringBuilder();
  182. try {
  183. // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
  184. OSSObject ossObject = ossClient.getObject(bucket, objectName);
  185. objectContent = ossObject.getObjectContent();
  186. try(BufferedReader reader = new BufferedReader(new InputStreamReader(objectContent))){
  187. while (true) {
  188. String line = reader.readLine();
  189. if (line == null) break;
  190. contentJson.append(line);
  191. }
  192. } catch (IOException e) {
  193. log.error("读取scene.json文件流失败", e);
  194. }
  195. }catch (Exception e){
  196. log.error("s3获取文件内容失败,key="+objectName, e);
  197. }finally {
  198. if(ossClient != null){
  199. ossClient.shutdown();
  200. }
  201. }
  202. return contentJson.toString();
  203. }
  204. public void uploadFileOss(File file) {
  205. if("local".equals(type)){
  206. localToOssUtil.uploadFileOss(file);
  207. return ;
  208. }
  209. if(file.isFile()){
  210. String ossPath = file.getPath();
  211. ossPath = ossPath.replace("/mnt/","");
  212. ossPath = ossPath.replace("\\","/");
  213. this.uploadOss(file.getPath(),ossPath);
  214. }else {
  215. File[] files = file.listFiles();
  216. for (File file1 : files) {
  217. uploadFileOss(file1);
  218. }
  219. }
  220. }
  221. public void copyFile( String sourcePath, String targetPath) {
  222. if("local".equals(type)){
  223. localToOssUtil.copyFile(sourcePath,targetPath);
  224. return;
  225. }
  226. OSSClient ossClient = new OSSClient(point, key, secrey);
  227. try {
  228. List<String> files = listKeysFromAli( sourcePath);
  229. if (ObjectUtils.isEmpty(files)) {
  230. return;
  231. }
  232. files.stream().forEach(file -> {
  233. log.info("oss-copy-file---sourcePath:{},targetPath:{}",sourcePath,targetPath);
  234. ossClient.copyObject(this.bucket, file, this.bucket, file.replace(sourcePath, targetPath));
  235. });
  236. } catch (Exception e) {
  237. log.error("列举文件目录失败,key:" + sourcePath, e);
  238. }finally {
  239. if(ossClient != null){
  240. ossClient.shutdown();
  241. }
  242. }
  243. }
  244. private String getMd5(String filePath){
  245. OSSClient ossClient = new OSSClient(point, key, secrey);
  246. String md5 = null;
  247. try {
  248. InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
  249. md5 = MD5Checksum.getMD5(inputStream);
  250. log.info("Calculated MD5 for " + filePath + " is " + md5);
  251. inputStream.close();
  252. }catch (Exception e){
  253. log.info("oss-getMd5-error:{}",e);
  254. }finally {
  255. if(ossClient != null){
  256. ossClient.shutdown();
  257. }
  258. }
  259. return md5;
  260. }
  261. private String getSHA1(String filePath){
  262. OSSClient ossClient = new OSSClient(point, key, secrey);
  263. String md5 = null;
  264. try {
  265. InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
  266. md5 = MD5Checksum.getSHA1(inputStream);
  267. log.info("Calculated MD5 for " + filePath + " is " + md5);
  268. inputStream.close();
  269. }catch (Exception e){
  270. log.info("oss-getMd5-error:{}",e);
  271. }finally {
  272. if(ossClient != null){
  273. ossClient.shutdown();
  274. }
  275. }
  276. return md5;
  277. }
  278. private Long getLastModified(String filePath){
  279. OSSClient ossClient = new OSSClient(point, key, secrey);
  280. try {
  281. GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, filePath);
  282. Date LastMo = ossClient.getObjectMetadata(getObjectMetadataRequest).getLastModified();
  283. return LastMo.getTime();
  284. }catch (Exception e){
  285. log.info("oss-getMd5-error:{}",e);
  286. }finally {
  287. if(ossClient != null){
  288. ossClient.shutdown();
  289. }
  290. }
  291. return null;
  292. }
  293. public FileInfoVo getFileInfo(String filePath,String bucket){
  294. if("local".equals(type)){
  295. return localToOssUtil.getFileInfo(filePath);
  296. }
  297. OSSClient ossClient = new OSSClient(point, key, secrey);
  298. try {
  299. GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, filePath);
  300. Date LastMo = ossClient.getObjectMetadata(getObjectMetadataRequest).getLastModified();
  301. String md5 = ossClient.getObjectMetadata(getObjectMetadataRequest).getETag();
  302. Long size = ossClient.getObjectMetadata(getObjectMetadataRequest).getContentLength();
  303. InputStream inputStream = ossClient.getObject(bucket, filePath).getObjectContent();
  304. String sha1 = MD5Checksum.getSHA1(inputStream);
  305. return new FileInfoVo(md5,sha1.toUpperCase(),LastMo.getTime(),size);
  306. }catch (Exception e){
  307. log.info("oss-getFileInfo-error:{}",filePath,e);
  308. }finally {
  309. if(ossClient != null){
  310. ossClient.shutdown();
  311. }
  312. }
  313. return null;
  314. }
  315. public FileInfoVo getFileInfo(String filePath){
  316. return getFileInfo(filePath,bucket);
  317. }
  318. public Long getSize(String filePath,String bucket){
  319. if("local".equals(type)){
  320. return localToOssUtil.getSize(filePath);
  321. }
  322. OSSClient ossClient = new OSSClient(point, key, secrey);
  323. Long total = 0L;
  324. try {
  325. List<String> files = listKeysFromAli( filePath);
  326. if (ObjectUtils.isEmpty(files)) {
  327. return 0L;
  328. }
  329. for (String file : files) {
  330. GetObjectRequest getObjectMetadataRequest = new GetObjectRequest(bucket, file);
  331. Long size = ossClient.getObjectMetadata(getObjectMetadataRequest).getContentLength();
  332. total += size;
  333. }
  334. }catch (Exception e){
  335. log.info("oss-getFileInfo-error:{}",e);
  336. }finally {
  337. if(ossClient != null){
  338. ossClient.shutdown();
  339. }
  340. }
  341. return total;
  342. }
  343. public Long getSize(String filePath){
  344. return getSize(filePath,bucket);
  345. }
  346. public String getOssPath(String path) {
  347. return path.replace(queryPath,"");
  348. }
  349. public boolean fileExist(String objKey) {
  350. return this.existKey(objKey);
  351. }
  352. }