DatabaseServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. package com.caimei.service.data.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.aliyuncs.DefaultAcsClient;
  4. import com.aliyuncs.IAcsClient;
  5. import com.aliyuncs.profile.DefaultProfile;
  6. import com.aliyuncs.utils.StringUtils;
  7. import com.caimei.annotation.CurrentUser;
  8. import com.caimei.mapper.cmMapper.FileMapper;
  9. import com.caimei.model.ResponseJson;
  10. import com.caimei.model.po.SysUser;
  11. import com.caimei.model.vo.FileTreeVo;
  12. import com.caimei.service.async.AsyncService;
  13. import com.caimei.service.data.DatabaseService;
  14. import com.caimei.utils.FileZipUtils;
  15. import com.caimei.utils.OSSUtils;
  16. import com.sun.org.apache.regexp.internal.RE;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.util.Assert;
  21. import org.springframework.web.bind.annotation.RequestBody;
  22. import org.springframework.web.multipart.MultipartFile;
  23. import javax.annotation.Resource;
  24. import javax.servlet.ServletOutputStream;
  25. import javax.servlet.http.HttpServletResponse;
  26. import java.io.*;
  27. import java.util.ArrayList;
  28. import java.util.HashMap;
  29. import java.util.List;
  30. import java.util.UUID;
  31. import java.util.concurrent.atomic.AtomicBoolean;
  32. /**
  33. * @author zzj
  34. */
  35. @Slf4j
  36. @Service
  37. public class DatabaseServiceImpl implements DatabaseService {
  38. @Resource
  39. private FileMapper fileMapper;
  40. @Value("${spring.profiles.active}")
  41. private String active;
  42. @Resource
  43. private AsyncService asyncService;
  44. @Override
  45. public ResponseJson<List<FileTreeVo>> getFileById(Integer fileId, Integer authUserId) {
  46. List<FileTreeVo> fileTree = fileMapper.findFileTree(fileId, authUserId, null);
  47. return ResponseJson.success(fileTree);
  48. }
  49. @Override
  50. public ResponseJson createPackage(Integer authUserId, Integer fileId, String packageName) {
  51. fileMapper.creatPackage(authUserId, fileId, packageName);
  52. return ResponseJson.success();
  53. }
  54. @Override
  55. public ResponseJson downLoadZip(Integer fileId, String packageName, Integer authUserId, HttpServletResponse response) {
  56. //有package则在服务器固定路径new file.mkdir
  57. UUID uuid = UUID.randomUUID();
  58. String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid + "/";
  59. String zipPath = filePath + packageName;
  60. String delPath = filePath;
  61. filePath = zipPath;
  62. if ("dev".equals(active)) {
  63. filePath = "D:\\caimei-workSpace\\file\\" + uuid + "\\";
  64. zipPath = filePath + packageName;
  65. delPath = filePath;
  66. filePath = filePath + packageName + "\\";
  67. }
  68. boolean mkdirs = new File(filePath).mkdirs();
  69. Assert.isTrue(mkdirs, "文件夹创建失败");
  70. String param = fileId + "," + authUserId;
  71. recursion(param, filePath);
  72. //压缩
  73. FileZipUtils.compress(zipPath, "", true);
  74. String s = zipPath + ".zip";
  75. String fileName = packageName + ".zip";
  76. File file = new File(s);
  77. try {
  78. if (file.exists()) {
  79. FileInputStream fileInputStream = new FileInputStream(file);
  80. ServletOutputStream outputStream = response.getOutputStream();
  81. // 设置下载文件的mineType,告诉浏览器下载文件类型
  82. // int i = fileName.lastIndexOf(".");
  83. // String substring = fileName.substring(i + 1, filePath.length());
  84. response.setContentType("application/zip");
  85. // 设置一个响应头,无论是否被浏览器解析,都下载
  86. response.setHeader("Content-disposition", "attachment; filename=" + fileName);
  87. byte[] bytes = new byte[1024];
  88. int len;
  89. while ((len = fileInputStream.read(bytes)) != -1) {
  90. outputStream.write(bytes, 0, len);
  91. }
  92. fileInputStream.close();
  93. outputStream.close();
  94. }
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. FileZipUtils.deleteFile(new File(delPath));
  99. return null;
  100. }
  101. @Override
  102. public ResponseJson insertNewFile(String fileName, String filePath, String previewUrl, Integer parentId, String fileType) {
  103. FileTreeVo fileTreeVo = new FileTreeVo();
  104. fileTreeVo.setFileName(fileName);
  105. fileTreeVo.setOssName(filePath);
  106. fileTreeVo.setOssUrl(previewUrl);
  107. fileTreeVo.setParentId(parentId);
  108. fileTreeVo.setFileType(fileType);
  109. fileMapper.insertNewFile(fileTreeVo);
  110. return ResponseJson.success();
  111. }
  112. @Override
  113. public ResponseJson<HashMap<String, String>> ossTokenGet() {
  114. return ResponseJson.success(OSSUtils.getToken());
  115. }
  116. @Override
  117. public ResponseJson getOssUploadResult(Integer authUserId, String fileName, String ossName, String ossUrl, String fileSize, Integer parentId, String mime) {
  118. FileTreeVo fileTreeVo = new FileTreeVo();
  119. fileTreeVo.setFileName(fileName);
  120. fileTreeVo.setOssName(ossName);
  121. fileTreeVo.setOssUrl(ossUrl);
  122. fileTreeVo.setParentId(parentId);
  123. if (fileName.contains(".")) {
  124. fileTreeVo.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
  125. }
  126. fileTreeVo.setFileSize(fileSize);
  127. fileTreeVo.setPackageType(1);
  128. fileTreeVo.setAuthUserId(authUserId);
  129. fileTreeVo.setMime(mime);
  130. fileMapper.insertNewFile(fileTreeVo);
  131. if (mime.contains("image")) {
  132. //图片保存缩略图
  133. asyncService.insertScreenshot(fileTreeVo);
  134. }
  135. return ResponseJson.success();
  136. }
  137. @Override
  138. public ResponseJson updatePackage(Integer fileId, String packageName, Integer packageType) {
  139. FileTreeVo fileTreeVo = new FileTreeVo();
  140. fileTreeVo.setId(fileId);
  141. fileTreeVo.setPackageType(packageType);
  142. fileTreeVo.setFileName(packageName);
  143. fileMapper.updateFile(fileTreeVo);
  144. return ResponseJson.success();
  145. }
  146. @Override
  147. public ResponseJson movePackage(String fileId, Integer parentId) {
  148. if (fileId.contains(",")) {
  149. String[] split = fileId.split(",");
  150. for (String s : split) {
  151. FileTreeVo fileTreeVo = new FileTreeVo();
  152. fileTreeVo.setId(Integer.valueOf(s));
  153. fileTreeVo.setParentId(parentId);
  154. fileMapper.updateFile(fileTreeVo);
  155. }
  156. } else {
  157. FileTreeVo fileTreeVo = new FileTreeVo();
  158. fileTreeVo.setId(Integer.valueOf(fileId));
  159. fileTreeVo.setParentId(parentId);
  160. fileMapper.updateFile(fileTreeVo);
  161. }
  162. return ResponseJson.success();
  163. }
  164. @Override
  165. public ResponseJson deleteFiles(String fileId) {
  166. if (fileId.contains(",")) {
  167. String[] split = fileId.split(",");
  168. for (String s : split) {
  169. deleteFilesById(Integer.valueOf(s));
  170. }
  171. } else {
  172. deleteFilesById(Integer.valueOf(fileId));
  173. }
  174. return ResponseJson.success();
  175. }
  176. private void deleteFilesById(Integer fileId) {
  177. FileTreeVo file = fileMapper.findFile(fileId, null, null);
  178. if (0 == file.getPackageType()) {
  179. //文件夹
  180. List<FileTreeVo> fileTree = fileMapper.findFileTree(fileId, null, null);
  181. fileTree.forEach(f -> {
  182. deleteFilesById(f.getId());
  183. });
  184. fileMapper.deleteFileTreeById(fileId);
  185. } else {
  186. //单文件
  187. OSSUtils.deleteSingleFile(file.getOssName());
  188. fileMapper.deleteFileTreeById(fileId);
  189. }
  190. }
  191. @Override
  192. public ResponseJson<FileTreeVo> getCrumbs(Integer fileId, Integer authUserId) {
  193. if (fileId > 0) {
  194. FileTreeVo file = fileMapper.findFile(fileId, authUserId, null);
  195. FileTreeVo crumbsParent = getCrumbsParent(file, authUserId);
  196. return ResponseJson.success(crumbsParent);
  197. } else {
  198. return ResponseJson.success();
  199. }
  200. }
  201. @Override
  202. public ResponseJson<FileTreeVo> getPackageTree(Integer authUserId) {
  203. FileTreeVo fileTreeVo = new FileTreeVo();
  204. fileTreeVo.setId(0);
  205. fileTreeVo.setAuthUserId(authUserId);
  206. fileTreeVo.setPackageType(0);
  207. PackageTree(fileTreeVo);
  208. return ResponseJson.success(fileTreeVo);
  209. }
  210. @Override
  211. public ResponseJson downLoadChoseZip(String fileId, Integer authUserId, HttpServletResponse response) {
  212. if (fileId.contains(",")) {
  213. String[] split = fileId.split(",");
  214. ArrayList<FileTreeVo> fileTreeVos = new ArrayList<>();
  215. for (String s : split) {
  216. FileTreeVo file = fileMapper.findFile(Integer.valueOf(s), authUserId, null);
  217. fileTreeVos.add(file);
  218. }
  219. //有package则在服务器固定路径new file.mkdir
  220. UUID uuid = UUID.randomUUID();
  221. String zipPath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid;
  222. String filePath = zipPath;
  223. if ("dev".equals(active)) {
  224. zipPath = "D:\\caimei-workSpace\\file\\" + uuid;
  225. filePath = zipPath;
  226. }
  227. boolean mkdirs = new File(filePath).mkdirs();
  228. Assert.isTrue(mkdirs, "文件夹创建失败");
  229. for (FileTreeVo fileTreeVo : fileTreeVos) {
  230. if (1 == fileTreeVo.getPackageType()) {
  231. //普通文件直接下载到临时文件夹uuid下
  232. String fileName = "";
  233. if ("dev".equals(active)) {
  234. fileName = zipPath + "\\" + fileTreeVo.getFileName();
  235. } else {
  236. fileName = zipPath + "/" + fileTreeVo.getFileName();
  237. }
  238. OSSUtils.downFileByFilePath("authFile/", fileTreeVo.getOssName(), fileName);
  239. } else {
  240. //文件夹在uuid文件夹下创建自己包名的文件夹
  241. String param = fileTreeVo.getId() + "," + authUserId;
  242. String myPath = "";
  243. myPath = filePath + "/" + fileTreeVo.getFileName();
  244. if ("dev".equals(active)) {
  245. myPath = filePath + "\\" + fileTreeVo.getFileName();
  246. }
  247. boolean dirs = new File(myPath).mkdirs();
  248. Assert.isTrue(dirs, "文件夹创建失败");
  249. recursion(param, myPath);
  250. }
  251. }
  252. //压缩
  253. FileZipUtils.compress(zipPath, "", true);
  254. String s = zipPath + ".zip";
  255. String fileName = uuid + ".zip";
  256. File file = new File(s);
  257. try {
  258. if (file.exists()) {
  259. FileInputStream fileInputStream = new FileInputStream(file);
  260. ServletOutputStream outputStream = response.getOutputStream();
  261. // 设置下载文件的mineType,告诉浏览器下载文件类型
  262. // int i = fileName.lastIndexOf(".");
  263. // String substring = fileName.substring(i + 1, filePath.length());
  264. response.setContentType("application/zip");
  265. // 设置一个响应头,无论是否被浏览器解析,都下载
  266. response.setHeader("Content-disposition", "attachment; filename=" + fileName);
  267. byte[] bytes = new byte[1024];
  268. int len;
  269. while ((len = fileInputStream.read(bytes)) != -1) {
  270. outputStream.write(bytes, 0, len);
  271. }
  272. fileInputStream.close();
  273. outputStream.close();
  274. }
  275. } catch (IOException e) {
  276. e.printStackTrace();
  277. }
  278. file.delete();
  279. FileZipUtils.deleteFile(new File(zipPath));
  280. }
  281. return null;
  282. }
  283. @Override
  284. public ResponseJson<FileTreeVo> getFileDetail(Integer fileId, Integer authUserId) {
  285. FileTreeVo file = fileMapper.findFile(fileId, authUserId, null);
  286. return ResponseJson.success(file);
  287. }
  288. private void PackageTree(FileTreeVo fileTreeVo) {
  289. if (null == fileTreeVo) {
  290. return;
  291. }
  292. List<FileTreeVo> fileList = fileMapper.findFileTree(fileTreeVo.getId(), fileTreeVo.getAuthUserId(), fileTreeVo.getPackageType());
  293. if (null != fileList && fileList.size() > 0) {
  294. fileTreeVo.setChildList(fileList);
  295. }
  296. fileList.forEach(this::PackageTree);
  297. }
  298. private FileTreeVo getCrumbsParent(FileTreeVo file, Integer authUserId) {
  299. if (null == file || 0 == file.getParentId()) {
  300. return file;
  301. }
  302. FileTreeVo fil = fileMapper.findFile(file.getParentId(), authUserId, null);
  303. fil.setChildNode(file);
  304. return getCrumbsParent(fil, authUserId);
  305. }
  306. private void recursion(String param, String filePath) {
  307. String[] split = param.split(",");
  308. Integer fileId = Integer.valueOf(split[0]);
  309. Integer authUserId = Integer.valueOf(split[1]);
  310. //1.如果当前目录存在普通文件,下载当前目录下的文件到文件夹中
  311. String finalFilePath = filePath;
  312. List<FileTreeVo> commonFile = existsPackageOrCommonFile(fileId, authUserId, 2);
  313. if (null != commonFile && commonFile.size() > 0) {
  314. commonFile.forEach(c -> {
  315. String fileName = "";
  316. if ("dev".equals(active)) {
  317. fileName = finalFilePath + "\\" + c.getFileName();
  318. } else {
  319. fileName = finalFilePath + "/" + c.getFileName();
  320. }
  321. OSSUtils.downFileByFilePath("authFile/", c.getOssName(), fileName);
  322. });
  323. }
  324. //2.如果存在文件夹循环文件夹,递归本方法
  325. List<FileTreeVo> packages = existsPackageOrCommonFile(fileId, authUserId, 1);
  326. HashMap<String, String> sonPackage = new HashMap<String, String>();
  327. if (null != packages && packages.size() > 0) {
  328. for (FileTreeVo aPackage : packages) {
  329. if ("dev".equals(active)) {
  330. filePath = finalFilePath + "\\" + aPackage.getFileName();
  331. } else {
  332. filePath = finalFilePath + "/" + aPackage.getFileName();
  333. }
  334. File fil = new File(filePath.toString());
  335. fil.mkdirs();
  336. String params = aPackage.getId() + "," + authUserId;
  337. sonPackage.put(params, filePath);
  338. }
  339. }
  340. sonPackage.forEach(this::recursion);
  341. }
  342. /**
  343. * selectFor 1文件夹package,2普通文件
  344. *
  345. * @param fileId
  346. * @param selectFor
  347. * @return
  348. */
  349. private List<FileTreeVo> existsPackageOrCommonFile(Integer fileId, Integer authUserId, Integer selectFor) {
  350. return fileMapper.findSonPackage(fileId, authUserId, selectFor);
  351. }
  352. @Override
  353. public ResponseJson uploadDictionary(MultipartFile[] File){
  354. //文件上传前的名称
  355. List<String> filenames=new ArrayList<>();
  356. for (MultipartFile multipartFile:File) {
  357. String fileName = multipartFile.getOriginalFilename();
  358. File file = new File(fileName);
  359. OutputStream out = null;
  360. try{
  361. //获取文件流,以文件流的方式输出到新文件
  362. // InputStream in = multipartFile.getInputStream();
  363. out = new FileOutputStream(file);
  364. byte[] ss = multipartFile.getBytes();
  365. for(int i = 0; i < ss.length; i++){
  366. out.write(ss[i]);
  367. }
  368. }catch(IOException e){
  369. e.printStackTrace();
  370. }finally {
  371. if (out != null){
  372. try {
  373. out.close();
  374. } catch (IOException e) {
  375. e.printStackTrace();
  376. }
  377. }
  378. }
  379. //保存文件夹及其文件
  380. upload(file,filenames);
  381. }
  382. return ResponseJson.success();
  383. }
  384. public List<String> upload(File file,List<String> filenames){
  385. File[] files=file.listFiles();
  386. for (File f:files) {
  387. if(f.isDirectory()){
  388. //递归 保存文件夹(返回父id,便于确定属于哪级目录)
  389. fileMapper.creatPackage(0, 0, f.getName());
  390. return upload(f,filenames);
  391. }else{
  392. //保存文件
  393. filenames.add(f.getName());
  394. }
  395. }
  396. return filenames;
  397. }
  398. @Override
  399. public ResponseJson uploadPackage(Integer authUserId,List<FileTreeVo> fileTreeVos){
  400. //如果文件夹没有文件则直接返回
  401. for (FileTreeVo fileTreeVo:fileTreeVos) {
  402. if (StringUtils.isNotEmpty(fileTreeVo.getFilePath())) {
  403. if (!fileTreeVo.getFilePath().contains(".")) {
  404. ResponseJson.error("-1", "文件夹为空");
  405. }
  406. String[] filePathArr = fileTreeVo.getFilePath().split("/");
  407. String file=fileTreeVo.getFilePath().substring(fileTreeVo.getFilePath().lastIndexOf("/")+1,fileTreeVo.getFilePath().length());
  408. for (int i = 0; i < filePathArr.length; i++) {
  409. if (filePathArr.length-1==i&&filePathArr[i].equals(file)) {
  410. //新增文件
  411. getOssUploadResult(authUserId, filePathArr[i], fileTreeVo.getOssName(), fileTreeVo.getOssUrl(), fileTreeVo.getFileSize(), fileTreeVo.getParentId(), fileTreeVo.getMime());
  412. System.out.println("文件---------" + filePathArr[i]);
  413. } else {
  414. //判断是否根目录
  415. List<Integer> dictionaryById=new ArrayList<>();
  416. if(null!=fileTreeVo.getParentId()&&0==fileTreeVo.getParentId()){
  417. dictionaryById=fileMapper.findDictionaryById(null,filePathArr[i],authUserId);
  418. }else{
  419. dictionaryById = fileMapper.findDictionaryById(fileTreeVo.getParentId(),filePathArr[i],authUserId);
  420. if(null==dictionaryById||dictionaryById.size()<=0){
  421. //判断次级目录是否存在
  422. List<Integer> secondDictionaryById = fileMapper.findSecondDictionaryById(fileTreeVo.getParentId(), filePathArr[i],authUserId);
  423. if(null!=secondDictionaryById&&secondDictionaryById.size()>0){
  424. dictionaryById.add(secondDictionaryById.get(0));
  425. }
  426. }
  427. }
  428. //创建文件夹
  429. //判断文件夹是否存在(不存在则新建,存在则跳过)
  430. if (null != dictionaryById && dictionaryById.size() > 0) {
  431. fileTreeVo.setParentId(dictionaryById.get(0));
  432. continue;
  433. } else {
  434. //不存在创建文件夹
  435. fileMapper.creatPackage(authUserId, fileTreeVo.getParentId(), filePathArr[i]);
  436. //查询最新文件夹id作为下一次的父id
  437. List<Integer> newestInfoById = fileMapper.getNewestInfoById();
  438. if (null != newestInfoById && newestInfoById.size() > 0) {
  439. fileTreeVo.setParentId(newestInfoById.get(0));
  440. // parentId = newestInfoById.get(0);
  441. }
  442. }
  443. System.out.println("文件夹---------" + filePathArr[i]);
  444. }
  445. }
  446. } else {
  447. ResponseJson.error("-1", "文件夹为空");
  448. }
  449. }
  450. return ResponseJson.success();
  451. }
  452. }