|
@@ -0,0 +1,376 @@
|
|
|
+package com.caimei.service.data.impl;
|
|
|
+
|
|
|
+import com.aliyuncs.DefaultAcsClient;
|
|
|
+import com.aliyuncs.IAcsClient;
|
|
|
+import com.aliyuncs.profile.DefaultProfile;
|
|
|
+import com.caimei.mapper.cmMapper.FileMapper;
|
|
|
+import com.caimei.model.ResponseJson;
|
|
|
+import com.caimei.model.vo.FileTreeVo;
|
|
|
+import com.caimei.service.async.AsyncService;
|
|
|
+import com.caimei.service.data.DatabaseService;
|
|
|
+import com.caimei.utils.FileZipUtils;
|
|
|
+import com.caimei.utils.OSSUtils;
|
|
|
+import com.sun.org.apache.regexp.internal.RE;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.Assert;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.UUID;
|
|
|
+import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author zzj
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class DatabaseServiceImpl implements DatabaseService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FileMapper fileMapper;
|
|
|
+
|
|
|
+ @Value("${spring.profiles.active}")
|
|
|
+ private String active;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private AsyncService asyncService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson<List<FileTreeVo>> getFileById(Integer fileId, Integer authUserId) {
|
|
|
+ List<FileTreeVo> fileTree = fileMapper.findFileTree(fileId, authUserId, null);
|
|
|
+ return ResponseJson.success(fileTree);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson createPackage(Integer authUserId, Integer fileId, String packageName) {
|
|
|
+ fileMapper.creatPackage(authUserId, fileId, packageName);
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson downLoadZip(Integer fileId, String packageName, Integer authUserId, HttpServletResponse response) {
|
|
|
+ //有package则在服务器固定路径new file.mkdir
|
|
|
+ UUID uuid = UUID.randomUUID();
|
|
|
+ String filePath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid + "/";
|
|
|
+ String zipPath = filePath + packageName;
|
|
|
+ String delPath = filePath;
|
|
|
+ filePath = zipPath;
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ filePath = "D:\\caimei-workSpace\\file\\" + uuid + "\\";
|
|
|
+ zipPath = filePath + packageName;
|
|
|
+ delPath = filePath;
|
|
|
+ filePath = filePath + packageName + "\\";
|
|
|
+ }
|
|
|
+ boolean mkdirs = new File(filePath).mkdirs();
|
|
|
+ Assert.isTrue(mkdirs, "文件夹创建失败");
|
|
|
+
|
|
|
+ String param = fileId + "," + authUserId;
|
|
|
+ recursion(param, filePath);
|
|
|
+ //压缩
|
|
|
+ FileZipUtils.compress(zipPath, "", true);
|
|
|
+ String s = zipPath + ".zip";
|
|
|
+ String fileName = packageName + ".zip";
|
|
|
+ File file = new File(s);
|
|
|
+ try {
|
|
|
+ if (file.exists()) {
|
|
|
+ FileInputStream fileInputStream = new FileInputStream(file);
|
|
|
+ ServletOutputStream outputStream = response.getOutputStream();
|
|
|
+ // 设置下载文件的mineType,告诉浏览器下载文件类型
|
|
|
+ // int i = fileName.lastIndexOf(".");
|
|
|
+ // String substring = fileName.substring(i + 1, filePath.length());
|
|
|
+ response.setContentType("application/zip");
|
|
|
+ // 设置一个响应头,无论是否被浏览器解析,都下载
|
|
|
+ response.setHeader("Content-disposition", "attachment; filename=" + fileName);
|
|
|
+ byte[] bytes = new byte[1024];
|
|
|
+ int len;
|
|
|
+ while ((len = fileInputStream.read(bytes)) != -1) {
|
|
|
+ outputStream.write(bytes, 0, len);
|
|
|
+ }
|
|
|
+ fileInputStream.close();
|
|
|
+ outputStream.close();
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ FileZipUtils.deleteFile(new File(delPath));
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson insertNewFile(String fileName, String filePath, String previewUrl, Integer parentId, String fileType) {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setFileName(fileName);
|
|
|
+ fileTreeVo.setOssName(filePath);
|
|
|
+ fileTreeVo.setOssUrl(previewUrl);
|
|
|
+ fileTreeVo.setParentId(parentId);
|
|
|
+ fileTreeVo.setFileType(fileType);
|
|
|
+ fileMapper.insertNewFile(fileTreeVo);
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson<HashMap<String, String>> ossTokenGet() {
|
|
|
+ return ResponseJson.success(OSSUtils.getToken());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson getOssUploadResult(Integer authUserId, String fileName, String ossName, String ossUrl, String fileSize, Integer parentId, String mime) {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setFileName(fileName);
|
|
|
+ fileTreeVo.setOssName(ossName);
|
|
|
+ fileTreeVo.setOssUrl(ossUrl);
|
|
|
+ fileTreeVo.setParentId(parentId);
|
|
|
+ if (fileName.contains(".")) {
|
|
|
+ fileTreeVo.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
|
|
|
+ }
|
|
|
+ fileTreeVo.setFileSize(fileSize);
|
|
|
+ fileTreeVo.setPackageType(1);
|
|
|
+ fileTreeVo.setAuthUserId(authUserId);
|
|
|
+ fileTreeVo.setMime(mime);
|
|
|
+ fileMapper.insertNewFile(fileTreeVo);
|
|
|
+ if (mime.contains("image")) {
|
|
|
+ //图片保存缩略图
|
|
|
+ asyncService.insertScreenshot(fileTreeVo);
|
|
|
+ }
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson updatePackage(Integer fileId, String packageName, Integer packageType) {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setId(fileId);
|
|
|
+ fileTreeVo.setPackageType(packageType);
|
|
|
+ fileTreeVo.setFileName(packageName);
|
|
|
+ fileMapper.updateFile(fileTreeVo);
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson movePackage(String fileId, Integer parentId) {
|
|
|
+ if (fileId.contains(",")) {
|
|
|
+ String[] split = fileId.split(",");
|
|
|
+ for (String s : split) {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setId(Integer.valueOf(s));
|
|
|
+ fileTreeVo.setParentId(parentId);
|
|
|
+ fileMapper.updateFile(fileTreeVo);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setId(Integer.valueOf(fileId));
|
|
|
+ fileTreeVo.setParentId(parentId);
|
|
|
+ fileMapper.updateFile(fileTreeVo);
|
|
|
+ }
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson deleteFiles(String fileId) {
|
|
|
+ if (fileId.contains(",")) {
|
|
|
+ String[] split = fileId.split(",");
|
|
|
+ for (String s : split) {
|
|
|
+ deleteFilesById(Integer.valueOf(s));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ deleteFilesById(Integer.valueOf(fileId));
|
|
|
+ }
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void deleteFilesById(Integer fileId) {
|
|
|
+ FileTreeVo file = fileMapper.findFile(fileId, null, null);
|
|
|
+ if (0 == file.getPackageType()) {
|
|
|
+ //文件夹
|
|
|
+ List<FileTreeVo> fileTree = fileMapper.findFileTree(fileId, null, null);
|
|
|
+ fileTree.forEach(f -> {
|
|
|
+ deleteFilesById(f.getId());
|
|
|
+ });
|
|
|
+ fileMapper.deleteFileTreeById(fileId);
|
|
|
+ } else {
|
|
|
+ //单文件
|
|
|
+ OSSUtils.deleteSingleFile(file.getOssName());
|
|
|
+ fileMapper.deleteFileTreeById(fileId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson<FileTreeVo> getCrumbs(Integer fileId, Integer authUserId) {
|
|
|
+ if (fileId > 0) {
|
|
|
+ FileTreeVo file = fileMapper.findFile(fileId, authUserId, null);
|
|
|
+ FileTreeVo crumbsParent = getCrumbsParent(file, authUserId);
|
|
|
+ return ResponseJson.success(crumbsParent);
|
|
|
+ } else {
|
|
|
+ return ResponseJson.success();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson<FileTreeVo> getPackageTree(Integer authUserId) {
|
|
|
+ FileTreeVo fileTreeVo = new FileTreeVo();
|
|
|
+ fileTreeVo.setId(0);
|
|
|
+ fileTreeVo.setAuthUserId(authUserId);
|
|
|
+ fileTreeVo.setPackageType(0);
|
|
|
+ PackageTree(fileTreeVo);
|
|
|
+ return ResponseJson.success(fileTreeVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson downLoadChoseZip(String fileId, Integer authUserId, HttpServletResponse response) {
|
|
|
+ if (fileId.contains(",")) {
|
|
|
+ String[] split = fileId.split(",");
|
|
|
+ ArrayList<FileTreeVo> fileTreeVos = new ArrayList<>();
|
|
|
+ for (String s : split) {
|
|
|
+ FileTreeVo file = fileMapper.findFile(Integer.valueOf(s), authUserId, null);
|
|
|
+ fileTreeVos.add(file);
|
|
|
+ }
|
|
|
+ //有package则在服务器固定路径new file.mkdir
|
|
|
+ UUID uuid = UUID.randomUUID();
|
|
|
+ String zipPath = "/mnt/newdatadrive/data/runtime/jar-instance/zplma/tempFile/" + uuid;
|
|
|
+ String filePath = zipPath;
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ zipPath = "D:\\caimei-workSpace\\file\\" + uuid;
|
|
|
+ filePath = zipPath;
|
|
|
+ }
|
|
|
+ boolean mkdirs = new File(filePath).mkdirs();
|
|
|
+ Assert.isTrue(mkdirs, "文件夹创建失败");
|
|
|
+
|
|
|
+ for (FileTreeVo fileTreeVo : fileTreeVos) {
|
|
|
+ if (1 == fileTreeVo.getPackageType()) {
|
|
|
+ //普通文件直接下载到临时文件夹uuid下
|
|
|
+ String fileName = "";
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ fileName = zipPath + "\\" + fileTreeVo.getFileName();
|
|
|
+ } else {
|
|
|
+ fileName = zipPath + "/" + fileTreeVo.getFileName();
|
|
|
+ }
|
|
|
+ OSSUtils.downFileByFilePath("authFile/", fileTreeVo.getOssName(), fileName);
|
|
|
+ } else {
|
|
|
+ //文件夹在uuid文件夹下创建自己包名的文件夹
|
|
|
+ String param = fileTreeVo.getId() + "," + authUserId;
|
|
|
+ String myPath = "";
|
|
|
+ myPath = filePath + "/" + fileTreeVo.getFileName();
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ myPath = filePath + "\\" + fileTreeVo.getFileName();
|
|
|
+ }
|
|
|
+ boolean dirs = new File(myPath).mkdirs();
|
|
|
+ Assert.isTrue(dirs, "文件夹创建失败");
|
|
|
+ recursion(param, myPath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //压缩
|
|
|
+ FileZipUtils.compress(zipPath, "", true);
|
|
|
+ String s = zipPath + ".zip";
|
|
|
+ String fileName = uuid + ".zip";
|
|
|
+ File file = new File(s);
|
|
|
+ try {
|
|
|
+ if (file.exists()) {
|
|
|
+ FileInputStream fileInputStream = new FileInputStream(file);
|
|
|
+ ServletOutputStream outputStream = response.getOutputStream();
|
|
|
+ // 设置下载文件的mineType,告诉浏览器下载文件类型
|
|
|
+// int i = fileName.lastIndexOf(".");
|
|
|
+// String substring = fileName.substring(i + 1, filePath.length());
|
|
|
+ response.setContentType("application/zip");
|
|
|
+ // 设置一个响应头,无论是否被浏览器解析,都下载
|
|
|
+ response.setHeader("Content-disposition", "attachment; filename=" + fileName);
|
|
|
+ byte[] bytes = new byte[1024];
|
|
|
+ int len;
|
|
|
+ while ((len = fileInputStream.read(bytes)) != -1) {
|
|
|
+ outputStream.write(bytes, 0, len);
|
|
|
+ }
|
|
|
+ fileInputStream.close();
|
|
|
+ outputStream.close();
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ file.delete();
|
|
|
+ FileZipUtils.deleteFile(new File(zipPath));
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseJson<FileTreeVo> getFileDetail(Integer fileId, Integer authUserId) {
|
|
|
+ FileTreeVo file = fileMapper.findFile(fileId, authUserId, null);
|
|
|
+ return ResponseJson.success(file);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void PackageTree(FileTreeVo fileTreeVo) {
|
|
|
+ if (null == fileTreeVo) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<FileTreeVo> fileList = fileMapper.findFileTree(fileTreeVo.getId(), fileTreeVo.getAuthUserId(), fileTreeVo.getPackageType());
|
|
|
+ if (null != fileList && fileList.size() > 0) {
|
|
|
+ fileTreeVo.setChildList(fileList);
|
|
|
+ }
|
|
|
+ fileList.forEach(this::PackageTree);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private FileTreeVo getCrumbsParent(FileTreeVo file, Integer authUserId) {
|
|
|
+ if (null == file || 0 == file.getParentId()) {
|
|
|
+ return file;
|
|
|
+ }
|
|
|
+ FileTreeVo fil = fileMapper.findFile(file.getParentId(), authUserId, null);
|
|
|
+ fil.setChildNode(file);
|
|
|
+ return getCrumbsParent(fil, authUserId);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void recursion(String param, String filePath) {
|
|
|
+ String[] split = param.split(",");
|
|
|
+ Integer fileId = Integer.valueOf(split[0]);
|
|
|
+ Integer authUserId = Integer.valueOf(split[1]);
|
|
|
+ //1.如果当前目录存在普通文件,下载当前目录下的文件到文件夹中
|
|
|
+ String finalFilePath = filePath;
|
|
|
+ List<FileTreeVo> commonFile = existsPackageOrCommonFile(fileId, authUserId, 2);
|
|
|
+ if (null != commonFile && commonFile.size() > 0) {
|
|
|
+ commonFile.forEach(c -> {
|
|
|
+ String fileName = "";
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ fileName = finalFilePath + "\\" + c.getFileName();
|
|
|
+ } else {
|
|
|
+ fileName = finalFilePath + "/" + c.getFileName();
|
|
|
+ }
|
|
|
+ OSSUtils.downFileByFilePath("authFile/", c.getOssName(), fileName);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //2.如果存在文件夹循环文件夹,递归本方法
|
|
|
+ List<FileTreeVo> packages = existsPackageOrCommonFile(fileId, authUserId, 1);
|
|
|
+ HashMap<String, String> sonPackage = new HashMap<String, String>();
|
|
|
+ if (null != packages && packages.size() > 0) {
|
|
|
+ for (FileTreeVo aPackage : packages) {
|
|
|
+ if ("dev".equals(active)) {
|
|
|
+ filePath = finalFilePath + "\\" + aPackage.getFileName();
|
|
|
+ } else {
|
|
|
+ filePath = finalFilePath + "/" + aPackage.getFileName();
|
|
|
+ }
|
|
|
+ File fil = new File(filePath.toString());
|
|
|
+ fil.mkdirs();
|
|
|
+ String params = aPackage.getId() + "," + authUserId;
|
|
|
+ sonPackage.put(params, filePath);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sonPackage.forEach(this::recursion);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * selectFor 1文件夹package,2普通文件
|
|
|
+ *
|
|
|
+ * @param fileId
|
|
|
+ * @param selectFor
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<FileTreeVo> existsPackageOrCommonFile(Integer fileId, Integer authUserId, Integer selectFor) {
|
|
|
+ return fileMapper.findSonPackage(fileId, authUserId, selectFor);
|
|
|
+ }
|
|
|
+}
|