DatabaseServiceImpl.java 16 KB

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