From e8e5909abffde90b1af4b6bed87b4fd2975b796c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Sun, 14 Mar 2021 22:50:51 +0800 Subject: [PATCH 01/14] =?UTF-8?q?FastFDS=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- file-common/pom.xml | 17 +- .../common/operation/FileOperation.java | 6 +- .../qiwenshare/common/upload/Uploader.java | 23 +- .../factory/FastDFSUploaderFactory.java | 17 + .../upload/product/AliyunOSSUploader.java | 6 +- .../common/upload/product/ChunkUploader.java | 3 +- .../upload/product/FastDFSUploader.java | 240 +++++++++++ .../common/upload/product/NormalUploader.java | 2 +- .../com/qiwenshare/common/util/FileUtil.java | 5 +- .../qiwenshare/common/util/JedisConfig.java | 403 ++++++++++++++++++ .../qiwenshare/file/config/FdfsConfig.java | 14 + .../file/config/QiwenFileConfig.java | 2 + .../file/controller/FileController.java | 2 +- .../controller/FiletransferController.java | 2 +- .../qiwenshare/file/service/FileService.java | 2 +- .../file/service/FiletransferService.java | 4 + .../resources/config/application.properties | 9 + 17 files changed, 734 insertions(+), 23 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java create mode 100644 file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java diff --git a/file-common/pom.xml b/file-common/pom.xml index e1de449..434f716 100644 --- a/file-common/pom.xml +++ b/file-common/pom.xml @@ -49,10 +49,21 @@ + + + + + + - net.oschina.zcx7878 - fastdfs-client-java - 1.27.0.0 + com.github.tobato + fastdfs-client + 1.26.2 + + + redis.clients + jedis + 3.0.1 diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/FileOperation.java b/file-common/src/main/java/com/qiwenshare/common/operation/FileOperation.java index dfa4216..43ca028 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/FileOperation.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/FileOperation.java @@ -278,9 +278,9 @@ public class FileOperation { } } for (String zipPath : fileEntryNameList) { - if (FileUtil.isImageFile(FileUtil.getFileType(zipPath))) { + if (FileUtil.isImageFile(FileUtil.getFileExtendName(zipPath))) { File file = new File(destDirPath + zipPath); - File minFile = new File(destDirPath + FileUtil.getFileNameNotExtend(zipPath) + "_min." + FileUtil.getFileType(zipPath)); + File minFile = new File(destDirPath + FileUtil.getFileNameNotExtend(zipPath) + "_min." + FileUtil.getFileExtendName(zipPath)); try { ImageOperation.thumbnailsImage(file, minFile, 300); } catch (IOException e) { @@ -361,7 +361,7 @@ public class FileOperation { public static long deleteFileFromDisk(String fileurl) { String fileUrl = PathUtil.getStaticPath() + fileurl; - String extendName = FileUtil.getFileType(fileUrl); + String extendName = FileUtil.getFileExtendName(fileUrl); String minFileUrl = fileUrl.replace("." + extendName, "_min." + extendName); long filesize = getFileSize(fileUrl); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java index 07618bb..8b01901 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java @@ -4,8 +4,6 @@ import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.util.PathUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; @@ -29,7 +27,26 @@ public abstract class Uploader { protected StandardMultipartHttpServletRequest request = null; public abstract List upload(HttpServletRequest request); - +// +// +// protected static TrackerServer trackerServer = null; +// +// protected static StorageServer storageServer = null; +// +// static { +// try { +// //String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();; +// Properties properties = new Properties(); +// properties.setProperty("tracker_server ", "121.89.222.103"); +// properties.setProperty("http.tracker_http_port", "8090"); +// ClientGlobal.initByProperties(properties); +// TrackerClient trackerClient = new TrackerClient(); +// trackerServer = trackerClient.getConnection(); +// storageServer = trackerClient.getStoreStorage(trackerServer); +// } catch (Exception e) { +// log.error("FastDFS Client Init Fail!",e); +// } +// } /** * 根据字符串创建本地目录 并按照日期建立子目录返回 * diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java new file mode 100644 index 0000000..975d3cd --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java @@ -0,0 +1,17 @@ +package com.qiwenshare.common.upload.factory; + +import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.upload.product.FastDFSUploader; + +public class FastDFSUploaderFactory implements UploaderFactory { + @Override + public Uploader getUploader() { + return new FastDFSUploader(); + } + + @Override + public Uploader getUploader(UploadFile uploadFile) { + return new FastDFSUploader(uploadFile); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java index 5dcac39..9414f6d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java @@ -12,7 +12,6 @@ import com.qiwenshare.common.util.PathUtil; import lombok.Data; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -23,10 +22,7 @@ import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.RandomAccessFile; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; public class AliyunOSSUploader extends Uploader { private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUploader.class); @@ -111,7 +107,7 @@ public class AliyunOSSUploader extends Uploader { String fileName = getFileName(originalName); - String fileType = FileUtil.getFileType(originalName); + String fileType = FileUtil.getFileExtendName(originalName); uploadFile.setFileName(fileName); uploadFile.setFileType(fileType); uploadFile.setTimeStampName(timeStampName); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java index 13bb6e8..36efb75 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java @@ -9,7 +9,6 @@ import com.qiwenshare.common.util.PathUtil; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -93,7 +92,7 @@ public class ChunkUploader extends Uploader { String originalName = multipartfile.getOriginalFilename(); String fileName = getFileName(originalName); - String fileType = FileUtil.getFileType(originalName); + String fileType = FileUtil.getFileExtendName(originalName); uploadFile.setFileName(fileName); uploadFile.setFileType(fileType); uploadFile.setTimeStampName(timeStampName); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java new file mode 100644 index 0000000..af5c5cd --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java @@ -0,0 +1,240 @@ +package com.qiwenshare.common.upload.product; + +import com.github.tobato.fastdfs.domain.StorePath; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; +import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.util.FileUtil; +import com.qiwenshare.common.util.PathUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.util.*; + +@Slf4j +@Component +public class FastDFSUploader extends Uploader { + @Resource + AppendFileStorageClient defaultAppendFileStorageClient; + + UploadFile uploadFile; + + private static Map CURRENT_UPLOAD_CHUNK_NUMBER = new HashMap<>(); + private static Map UPLOADED_SIZE = new HashMap<>(); + private static Map STORE_PATH = new HashMap<>(); + private static Map LOCK_MAP = new HashMap<>(); + + public FastDFSUploader() { + + } + + public FastDFSUploader(UploadFile uploadFile) { + this.uploadFile = uploadFile; + } + + + @Override + public List upload(HttpServletRequest request) { + log.info("开始上传upload"); + + List saveUploadFileList = new ArrayList<>(); + this.request = (StandardMultipartHttpServletRequest) request; + + boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); + if (!isMultipart) { + UploadFile uploadFile = new UploadFile(); + uploadFile.setSuccess(0); + uploadFile.setMessage("未包含文件上传域"); + saveUploadFileList.add(uploadFile); + return saveUploadFileList; + } + DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 + String savePath = getSaveFilePath(); + dff.setRepository(new File(savePath)); + + try { + ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 + sfu.setSizeMax(this.maxSize * 1024L); + sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 + Iterator iter = this.request.getFileNames(); + while (iter.hasNext()) { + + saveUploadFileList = doUpload(savePath, iter); + } + } catch (IOException e) { + UploadFile uploadFile = new UploadFile(); + uploadFile.setSuccess(1); + uploadFile.setMessage("未知错误"); + saveUploadFileList.add(uploadFile); + e.printStackTrace(); + } + + log.info("结束上传"); + return saveUploadFileList; + } + + + + private List doUpload(String savePath, Iterator iter) throws IOException{ + + List saveUploadFileList = new ArrayList<>(); + + try { + MultipartFile multipartfile = this.request.getFile(iter.next()); + boolean uploadResult = uploadFileChunk(multipartfile); + if (!uploadResult) { + + } + String timeStampName = getTimeStampName(); + String originalName = multipartfile.getOriginalFilename(); + + String fileName = getFileName(originalName); + + String fileType = FileUtil.getFileExtendName(originalName); + uploadFile.setFileName(fileName); + uploadFile.setFileType(fileType); + uploadFile.setTimeStampName(timeStampName); + + + String confFilePath = savePath + FILE_SEPARATOR + uploadFile.getIdentifier() + "." + "conf"; + File confFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + confFilePath); + + + + boolean isComplete = checkUploadStatus(uploadFile, confFile); + if (isComplete) { + log.info("分片上传完成"); + + uploadFile.setUrl(STORE_PATH.get(uploadFile.getIdentifier())); + uploadFile.setSuccess(1); + uploadFile.setMessage("上传成功"); + } else { + uploadFile.setSuccess(0); + uploadFile.setMessage("未完成"); + } + + } catch (Exception e) { + log.error("上传出错:" + e); + } + + uploadFile.setIsOSS(1); + + uploadFile.setFileSize(uploadFile.getTotalSize()); + saveUploadFileList.add(uploadFile); + return saveUploadFileList; + } + + public boolean uploadFileChunk(MultipartFile multipartFile) { + + // 存储在fastdfs不带组的路径 +// String noGroupPath = ""; + log.info("当前文件的Md5:{}", uploadFile.getIdentifier()); + + // 真正的拥有者 + boolean currOwner = false; + + try { + + Boolean lock = LOCK_MAP.get(uploadFile.getIdentifier()); +// +// if (lock == null){ +// log.info("请求块锁失败"); +// return false; +// } + if (lock != null && lock) { + return false; + } + LOCK_MAP.put(uploadFile.getIdentifier(), true); + // 写入锁的当前拥有者 + currOwner = true; + + // redis中记录当前应该传第几块(从0开始) + Integer currentChunkInRedis = CURRENT_UPLOAD_CHUNK_NUMBER.get(uploadFile.getIdentifier()); + + log.info("当前块的大小:{}", uploadFile.getCurrentChunkSize()); + if (currentChunkInRedis == null) { + currentChunkInRedis = 1; + } + + //此段代码保证顺序,如果满足条件则返回失败 + if (uploadFile.getChunkNumber() < currentChunkInRedis) { + log.info("当前文件块已上传"); + return false; + } else if (uploadFile.getChunkNumber() > currentChunkInRedis) { + log.info("当前文件块需要等待上传,稍后请重试"); + return false; + } + + log.info("***********开始上传第{}块**********", uploadFile.getChunkNumber()); + StorePath storePath = null; + + try { + + if (uploadFile.getChunkNumber() <= 1) { + log.info("上传第一块"); + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber() + 1); + try { + storePath = defaultAppendFileStorageClient.uploadAppenderFile("default_group", multipartFile.getInputStream(), + multipartFile.getSize(), FileUtil.getFileExtendName(multipartFile.getOriginalFilename())); + // 记录第一个分片上传的大小 + UPLOADED_SIZE.put(uploadFile.getIdentifier(), uploadFile.getCurrentChunkSize()); + log.info("第一块上传完成"); + if (storePath == null) { + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); + log.info("获取远程文件路径出错"); + return false; + } + } catch (Exception e) { + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); + log.error("初次上传远程文件出错", e); + return false; + } + + STORE_PATH.put(uploadFile.getIdentifier(), storePath.getPath()); + log.info("上传文件 result = {}", storePath.getPath()); + } else { + log.info("上传第{}块:" + uploadFile.getChunkNumber()); + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber() + 1); + String path = STORE_PATH.get(uploadFile.getIdentifier()); + if (path == null) { + log.error("无法获取已上传服务器文件地址"); + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); + return false; + } + try { + Long alreadySize = UPLOADED_SIZE.get(uploadFile.getIdentifier()); + // 追加方式实际实用如果中途出错多次,可能会出现重复追加情况,这里改成修改模式,即时多次传来重复文件块,依然可以保证文件拼接正确 + defaultAppendFileStorageClient.modifyFile("default_group", path, multipartFile.getInputStream(), + multipartFile.getSize(), alreadySize); + // 记录分片上传的大小 + UPLOADED_SIZE.put(uploadFile.getIdentifier(), alreadySize + multipartFile.getSize()); + log.info("第{}块更新完成", uploadFile.getChunkNumber()); + } catch (Exception e) { + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); + log.error("更新远程文件出错", e); + return false; + } + } + } catch (Exception e) { + log.error("上传文件错误", e); + return false; + } + } finally { + // 锁的当前拥有者才能释放块上传锁 + if (currOwner) { + LOCK_MAP.put(uploadFile.getIdentifier(), false); + //JedisConfig.setString(chunkLockName, "0"); + } + } + log.info("***********第{}块上传成功**********", uploadFile.getChunkNumber()); + return true; + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java index 7bb4c35..b882b0e 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java @@ -71,7 +71,7 @@ public class NormalUploader extends Uploader { String fileName = getFileName(originalName); - String fileType = FileUtil.getFileType(originalName); + String fileType = FileUtil.getFileExtendName(originalName); uploadFile.setFileName(fileName); uploadFile.setFileType(fileType); uploadFile.setTimeStampName(timeStampName); diff --git a/file-common/src/main/java/com/qiwenshare/common/util/FileUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/FileUtil.java index 7e26492..47f5340 100644 --- a/file-common/src/main/java/com/qiwenshare/common/util/FileUtil.java +++ b/file-common/src/main/java/com/qiwenshare/common/util/FileUtil.java @@ -1,6 +1,5 @@ package com.qiwenshare.common.util; -import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -74,7 +73,7 @@ public class FileUtil { * @param fileName 文件名 * @return 文件扩展名 */ - public static String getFileType(String fileName) { + public static String getFileExtendName(String fileName) { if (fileName.lastIndexOf(".") == -1) { return ""; //这里暂时用jpg,后续应该去获取真实的文件类型 @@ -89,7 +88,7 @@ public class FileUtil { * @return 文件名(不带扩展名) */ public static String getFileNameNotExtend(String fileName) { - String fileType = getFileType(fileName); + String fileType = getFileExtendName(fileName); return fileName.replace("." + fileType, ""); } diff --git a/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java b/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java new file mode 100644 index 0000000..1e8b64b --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java @@ -0,0 +1,403 @@ +//package com.qiwenshare.common.util; +// +//import cn.hutool.core.util.StrUtil; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import redis.clients.jedis.Jedis; +//import redis.clients.jedis.JedisPool; +//import redis.clients.jedis.JedisPoolConfig; +// +//import java.util.List; +// +///** +// * @Description: JedisConfig +// * @ClassName: JedisConfig +// * @Author: xxx +// * @Date: 2019/12/31 16:23 +// * @Version: 1.0 +// */ +//public class JedisConfig { +// +// private static Logger logger = LoggerFactory.getLogger(JedisConfig.class); +// +// protected static final ThreadLocal threadLocalJedis = new ThreadLocal<>(); +// private static JedisPool jedisPool; +// /** +// * Redis服务器IP +// */ +// private static String ADDR_ARRAY = "192.168.1.122"; +// +// /** +// * Redis的端口号 +// */ +// private static int PORT = 6379; +// +// /** +// * 访问密码 +// */ +// private static String AUTH = "123456"; +// +// /** +// * 可用连接实例的最大数目,默认值为8 +// * 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 +// */ +// private static int MAX_ACTIVE = -1; +// +// /** +// * 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 +// */ +// private static int MAX_IDLE = 16; +// +// /** +// * 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; +// */ +// private static int MAX_WAIT = 1000 * 5; +// +// // 超时时间 +// private static int TIMEOUT = 1000 * 5; +// +// /** +// * 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; +// */ +// private static boolean TEST_ON_BORROW = true; +// +// /** +// * redis过期时间,以秒为单位 +// */ +// /** +// * 一小时 +// */ +// public final static int EXRP_HOUR = 60 * 60; +// /** +// * 一天 +// */ +// public final static int EXRP_DAY = 60 * 60 * 24; +// /** +// * 一个月 +// */ +// public final static int EXRP_MONTH = 60 * 60 * 24 * 30; +// +// public JedisConfig() { +// } +// +// static { +// initialPool(); +// } +// +// /** +// * 初始化Redis连接池,注意一定要在使用前初始化一次,一般在项目启动时初始化就行了 +// */ +// public static JedisPool initialPool() { +// JedisPool jp = null; +// try { +// JedisPoolConfig config = new JedisPoolConfig(); +// config.setMaxTotal(MAX_ACTIVE); +// config.setMaxIdle(MAX_IDLE); +// config.setMaxWaitMillis(MAX_WAIT); +// config.setTestOnBorrow(TEST_ON_BORROW); +// config.setTestOnCreate(true); +// config.setTestWhileIdle(true); +// config.setTestOnReturn(true); +// config.setNumTestsPerEvictionRun(-1); +// jp = new JedisPool(config, ADDR_ARRAY, PORT, TIMEOUT, AUTH); +// jedisPool = jp; +// threadLocalJedis.set(getJedis()); +// } catch (Exception e) { +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// } +// return jp; +// } +// +// /** +// * 获取Jedis实例,一定先初始化 +// * @return Jedis +// */ +// public static Jedis getJedis() { +// boolean success = false; +// Jedis jedis = null; +// int i=0; +// while (!success) { +// i++; +// try { +// if (jedisPool != null) { +// jedis = threadLocalJedis.get(); +// if (jedis == null){ +// jedis = jedisPool.getResource(); +// }else { +// if(!jedis.isConnected() && !jedis.getClient().isBroken()){ +// threadLocalJedis.set(null); +// jedis = jedisPool.getResource(); +// } +// return jedis; +// } +// }else { +// throw new RuntimeException("redis连接池初始化失败"); +// } +// } catch (Exception e) { +// System.out.println(Thread.currentThread().getName()+":第"+i+"次获取失败!!!"); +// success = false; +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// } +// if (jedis != null){ +// success = true; +// } +// if (i >= 10 && i < 20){ +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// if (i >= 20 && i < 30){ +// try { +// Thread.sleep(2000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// +// } +// if (i >= 30 && i < 40){ +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// if (i >= 40){ +// System.out.println("redis彻底连不上了~~~~(>_<)~~~~"); +// return null; +// } +// } +// if (threadLocalJedis.get() == null) { +// threadLocalJedis.set(jedis); +// } +// return jedis; +// } +// +// /** +// * 设置 String +// * @param key +// * @param value +// */ +// public static void setString(String key, String value) { +// Jedis jo = null; +// try { +// value = StrUtil.isBlank(value) ? "" : value; +// jo = getJedis(); +// jo.set(key, value); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis服务器异常"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// /** +// * 设置 过期时间 +// * @param key +// * @param seconds 以秒为单位 +// * @param value +// */ +// public static void setString(String key, int seconds, String value) { +// Jedis jo = null; +// try { +// value = StrUtil.isBlank(value) ? "" : value; +// jo = getJedis(); +// jo.setex(key, seconds, value); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis服务器异常"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// +// +// } +// +// /** +// * 获取String值 +// * @param key +// * @return value +// */ +// public static String getString(String key) { +// Jedis jo = null; +// try { +// jo = getJedis(); +// if (jo == null || !jo.exists(key)) { +// return null; +// } +// return jo.get(key); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// public static long incrBy(String key, long integer) { +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.incrBy(key, integer); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// public static long decrBy(String key, long integer) { +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.decrBy(key, integer); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// /** +// * 删除多个key +// */ +// public static long delKeys(String [] keys){ +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.del(keys); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// +// } +// +// /** +// * 删除单个key +// */ +// public static long delKey(String key){ +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.del(key); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// +// } +// +// /** +// * 添加到队列尾 +// */ +// public static long rpush(String key,String node){ +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.rpush(key,node); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// /** +// * 删除list元素 +// */ +// public static long delListNode(String key,int count,String value){ +// Jedis jo = null; +// try { +// jo = getJedis(); +// return jo.lrem(key,count,value); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// } +// +// /** +// * 获取所有list +// */ +// public static List getListAll(String key){ +// Jedis jo = null; +// List list=null; +// try { +// jo = getJedis(); +// list= jo.lrange(key,0,-1); +// } catch (Exception e) { +// threadLocalJedis.set(null); +// e.printStackTrace(); +// logger.error("redis服务器异常",e); +// throw new RuntimeException("redis操作错误"); +// } finally { +// if (jo != null) { +// close(jo); +// } +// } +// return list; +// } +// +// /** +// * 清理缓存redis +// */ +// public void cleanLoacl(Jedis jo){ +// threadLocalJedis.set(null); +// close(jo); +// } +// +// public static void close(Jedis jedis) { +// if (threadLocalJedis.get() == null && jedis != null){ +// jedis.close(); +// } +// } +//} \ No newline at end of file diff --git a/file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java b/file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java new file mode 100644 index 0000000..754eb5f --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java @@ -0,0 +1,14 @@ +package com.qiwenshare.file.config; + +import com.github.tobato.fastdfs.FdfsClientConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableMBeanExport; +import org.springframework.context.annotation.Import; +import org.springframework.jmx.support.RegistrationPolicy; + +@Configuration +@Import(FdfsClientConfig.class) +@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) +public class FdfsConfig { + +} \ No newline at end of file diff --git a/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java b/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java index 7b83d7e..f135471 100644 --- a/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java +++ b/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java @@ -12,6 +12,8 @@ public class QiwenFileConfig { private boolean shareMode; + private String storageType; + private AliyunConfig aliyun = new AliyunConfig(); } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index 756400b..f362f7f 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -309,7 +309,7 @@ public class FileController { }else{ userFile.setIsDir(0); - userFile.setExtendName(FileUtil.getFileType(totalFileUrl)); + userFile.setExtendName(FileUtil.getFileExtendName(totalFileUrl)); userFile.setFileName(FileUtil.getFileNameNotExtend(currentFile.getName())); tempFileBean.setFileSize(currentFile.length()); tempFileBean.setTimeStampName(FileUtil.getFileNameNotExtend(currentFile.getName())); diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index a0eb53b..ff229b3 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -76,7 +76,7 @@ public class FiletransferController { userFile.setFilePath(uploadFileDto.getFilePath()); String fileName = uploadFileDto.getFilename(); userFile.setFileName(fileName.substring(0, fileName.lastIndexOf("."))); - userFile.setExtendName(FileUtil.getFileType(fileName)); + userFile.setExtendName(FileUtil.getFileExtendName(fileName)); userFile.setDeleteFlag(0); userFile.setIsDir(0); userFile.setUploadTime(DateUtil.getCurrentTime()); diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java index 8e2d39e..1da0e6a 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java @@ -87,7 +87,7 @@ public class FileService extends ServiceImpl implements IF AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); } else { FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); - if (FileUtil.isImageFile(FileUtil.getFileType(fileBean.getFileUrl()))) { + if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); } } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index bee5fef..ee5caa1 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -13,6 +13,7 @@ import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.factory.AliyunOSSUploaderFactory; import com.qiwenshare.common.upload.factory.ChunkUploaderFactory; import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.upload.factory.FastDFSUploaderFactory; import com.qiwenshare.file.api.IFiletransferService; import com.qiwenshare.common.domain.AliyunOSS; @@ -45,6 +46,7 @@ public class FiletransferService implements IFiletransferService { @Override public void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId) { AliyunOSS oss = qiwenFileConfig.getAliyun().getOss(); + String storyType = qiwenFileConfig.getStorageType(); request.setAttribute("oss", oss); Uploader uploader; UploadFile uploadFile = new UploadFile(); @@ -56,6 +58,8 @@ public class FiletransferService implements IFiletransferService { uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); if (oss.isEnabled()) { uploader = new AliyunOSSUploaderFactory().getUploader(uploadFile); + } else if ("FastFDS".equals(storyType)) { + uploader = new FastDFSUploaderFactory().getUploader(uploadFile); } else { uploader = new ChunkUploaderFactory().getUploader(uploadFile); } diff --git a/file-web/src/main/resources/config/application.properties b/file-web/src/main/resources/config/application.properties index 8ad56c1..b798ae6 100644 --- a/file-web/src/main/resources/config/application.properties +++ b/file-web/src/main/resources/config/application.properties @@ -51,6 +51,8 @@ mybatis-plus.global-config.banner=false qiwen-file.remote-login=false qiwen-file.share-mode=false +#FastFDS +qiwen-file.storage-type=FastFDS #是否启用阿里云oss qiwen-file.aliyun.oss.enabled=false @@ -62,3 +64,10 @@ qiwen-file.aliyun.oss.bucket-name= #阿里云oss绑定域名 qiwen-file.aliyun.oss.domain= + +fdfs.so-timeout=1501 +fdfs.connect-timeout=601 +fdfs.thumb-image.width=150 +fdfs.thumb-image.height=150 +fdfs.tracker-list=121.89.222.103:22122 + From 8ca8f27c67acd80463583f4a7f1df2740c4e75f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Mon, 15 Mar 2021 19:35:14 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- file-common/pom.xml | 16 ----- .../common/exception/UploadException.java | 12 ++++ .../exception/UploadGeneralException.java | 16 +++++ .../qiwenshare/common/upload/Uploader.java | 21 +------ .../upload/product/AliyunOSSUploader.java | 36 +++++------ .../common/upload/product/ChunkUploader.java | 23 ++++--- .../upload/product/FastDFSUploader.java | 62 +++++++++++-------- .../file/controller/TaskController.java | 5 +- 8 files changed, 96 insertions(+), 95 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/exception/UploadException.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/exception/UploadGeneralException.java diff --git a/file-common/pom.xml b/file-common/pom.xml index 434f716..da8a36b 100644 --- a/file-common/pom.xml +++ b/file-common/pom.xml @@ -43,28 +43,12 @@ jjwt 0.9.1 - - - - - - - - - - - com.github.tobato fastdfs-client 1.26.2 - - redis.clients - jedis - 3.0.1 - diff --git a/file-common/src/main/java/com/qiwenshare/common/exception/UploadException.java b/file-common/src/main/java/com/qiwenshare/common/exception/UploadException.java new file mode 100644 index 0000000..c83a7e1 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/exception/UploadException.java @@ -0,0 +1,12 @@ +package com.qiwenshare.common.exception; + +public abstract class UploadException extends RuntimeException{ + + protected UploadException(String message) { + super(message); + } + + protected UploadException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/exception/UploadGeneralException.java b/file-common/src/main/java/com/qiwenshare/common/exception/UploadGeneralException.java new file mode 100644 index 0000000..a974354 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/exception/UploadGeneralException.java @@ -0,0 +1,16 @@ +package com.qiwenshare.common.exception; + +public class UploadGeneralException extends UploadException{ + + public UploadGeneralException(Throwable cause) { + super("上传出现了异常", cause); + } + + public UploadGeneralException(String message) { + super(message); + } + + public UploadGeneralException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java index 8b01901..b9615a0 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java @@ -27,26 +27,7 @@ public abstract class Uploader { protected StandardMultipartHttpServletRequest request = null; public abstract List upload(HttpServletRequest request); -// -// -// protected static TrackerServer trackerServer = null; -// -// protected static StorageServer storageServer = null; -// -// static { -// try { -// //String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();; -// Properties properties = new Properties(); -// properties.setProperty("tracker_server ", "121.89.222.103"); -// properties.setProperty("http.tracker_http_port", "8090"); -// ClientGlobal.initByProperties(properties); -// TrackerClient trackerClient = new TrackerClient(); -// trackerServer = trackerClient.getConnection(); -// storageServer = trackerClient.getStoreStorage(trackerServer); -// } catch (Exception e) { -// log.error("FastDFS Client Init Fail!",e); -// } -// } + /** * 根据字符串创建本地目录 并按照日期建立子目录返回 * diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java index 9414f6d..8d9518d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java @@ -6,6 +6,7 @@ import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.exception.UploadGeneralException; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; @@ -63,38 +64,32 @@ public class AliyunOSSUploader extends Uploader { bucketName = aliyunOSS.getBucketName(); boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); if (!isMultipart) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(0); - uploadFile.setMessage("未包含文件上传域"); - saveUploadFileList.add(uploadFile); - return saveUploadFileList; + throw new UploadGeneralException("未包含文件上传域"); +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(0); +// uploadFile.setMessage("未包含文件上传域"); +// saveUploadFileList.add(uploadFile); +// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); dff.setRepository(new File(savePath)); - try { - ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 - sfu.setSizeMax(this.maxSize * 1024L); - sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 - Iterator iter = this.request.getFileNames(); - while (iter.hasNext()) { + ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 + sfu.setSizeMax(this.maxSize * 1024L); + sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 + Iterator iter = this.request.getFileNames(); + while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); - } - } catch (IOException e) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(1); - uploadFile.setMessage("未知错误"); - saveUploadFileList.add(uploadFile); - e.printStackTrace(); + saveUploadFileList = doUpload(savePath, iter); } + logger.info("结束上传"); return saveUploadFileList; } - private List doUpload(String savePath, Iterator iter) throws IOException { + private List doUpload(String savePath, Iterator iter) { OSS ossClient = getClient(); List saveUploadFileList = new ArrayList<>(); @@ -174,6 +169,7 @@ public class AliyunOSSUploader extends Uploader { } catch (Exception e) { logger.error("上传出错:" + e); + throw new UploadGeneralException(e); } uploadFile.setIsOSS(1); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java index 36efb75..6e530dd 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java @@ -2,6 +2,7 @@ package com.qiwenshare.common.upload.product; import com.qiwenshare.common.cbb.NotSameFileExpection; import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.exception.UploadGeneralException; import com.qiwenshare.common.operation.ImageOperation; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.util.FileUtil; @@ -42,11 +43,12 @@ public class ChunkUploader extends Uploader { this.request = (StandardMultipartHttpServletRequest) httpServletRequest; boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); if (!isMultipart) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(0); - uploadFile.setMessage("未包含文件上传域"); - saveUploadFileList.add(uploadFile); - return saveUploadFileList; + throw new UploadGeneralException("未包含文件上传域"); +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(0); +// uploadFile.setMessage("未包含文件上传域"); +// saveUploadFileList.add(uploadFile); +// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); @@ -61,11 +63,12 @@ public class ChunkUploader extends Uploader { saveUploadFileList = doUpload(savePath, iter); } } catch (IOException e) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(1); - uploadFile.setMessage("未知错误"); - saveUploadFileList.add(uploadFile); - e.printStackTrace(); +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(1); +// uploadFile.setMessage("未知错误"); +// saveUploadFileList.add(uploadFile); +// e.printStackTrace(); + throw new UploadGeneralException("未包含文件上传域"); } catch (NotSameFileExpection notSameFileExpection) { notSameFileExpection.printStackTrace(); } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java index af5c5cd..fc2a838 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java @@ -3,6 +3,7 @@ package com.qiwenshare.common.upload.product; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.exception.UploadGeneralException; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; @@ -50,11 +51,12 @@ public class FastDFSUploader extends Uploader { boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); if (!isMultipart) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(0); - uploadFile.setMessage("未包含文件上传域"); - saveUploadFileList.add(uploadFile); - return saveUploadFileList; + throw new UploadGeneralException("未包含文件上传域"); +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(0); +// uploadFile.setMessage("未包含文件上传域"); +// saveUploadFileList.add(uploadFile); +// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); @@ -69,12 +71,13 @@ public class FastDFSUploader extends Uploader { saveUploadFileList = doUpload(savePath, iter); } - } catch (IOException e) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(1); - uploadFile.setMessage("未知错误"); - saveUploadFileList.add(uploadFile); - e.printStackTrace(); + } catch (Exception e) { + throw new UploadGeneralException(e); +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(1); +// uploadFile.setMessage("未知错误"); +// saveUploadFileList.add(uploadFile); +// e.printStackTrace(); } log.info("结束上传"); @@ -83,16 +86,14 @@ public class FastDFSUploader extends Uploader { - private List doUpload(String savePath, Iterator iter) throws IOException{ + private List doUpload(String savePath, Iterator iter){ List saveUploadFileList = new ArrayList<>(); try { MultipartFile multipartfile = this.request.getFile(iter.next()); - boolean uploadResult = uploadFileChunk(multipartfile); - if (!uploadResult) { + uploadFileChunk(multipartfile); - } String timeStampName = getTimeStampName(); String originalName = multipartfile.getOriginalFilename(); @@ -122,7 +123,8 @@ public class FastDFSUploader extends Uploader { } } catch (Exception e) { - log.error("上传出错:" + e); + throw new UploadGeneralException(e); +// log.error("上传出错:" + e); } uploadFile.setIsOSS(1); @@ -132,7 +134,7 @@ public class FastDFSUploader extends Uploader { return saveUploadFileList; } - public boolean uploadFileChunk(MultipartFile multipartFile) { + public void uploadFileChunk(MultipartFile multipartFile) { // 存储在fastdfs不带组的路径 // String noGroupPath = ""; @@ -150,7 +152,8 @@ public class FastDFSUploader extends Uploader { // return false; // } if (lock != null && lock) { - return false; + throw new UploadGeneralException("请求块锁失败"); + //return false; } LOCK_MAP.put(uploadFile.getIdentifier(), true); // 写入锁的当前拥有者 @@ -167,10 +170,12 @@ public class FastDFSUploader extends Uploader { //此段代码保证顺序,如果满足条件则返回失败 if (uploadFile.getChunkNumber() < currentChunkInRedis) { log.info("当前文件块已上传"); - return false; + throw new UploadGeneralException("当前文件块已上传"); +// return false; } else if (uploadFile.getChunkNumber() > currentChunkInRedis) { log.info("当前文件块需要等待上传,稍后请重试"); - return false; + throw new UploadGeneralException("当前文件块需要等待上传,稍后请重试"); +// return false; } log.info("***********开始上传第{}块**********", uploadFile.getChunkNumber()); @@ -190,12 +195,14 @@ public class FastDFSUploader extends Uploader { if (storePath == null) { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.info("获取远程文件路径出错"); - return false; + throw new UploadGeneralException("获取远程文件路径出错"); +// return false; } } catch (Exception e) { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.error("初次上传远程文件出错", e); - return false; + throw new UploadGeneralException("初次上传远程文件出错", e); +// return false; } STORE_PATH.put(uploadFile.getIdentifier(), storePath.getPath()); @@ -207,7 +214,8 @@ public class FastDFSUploader extends Uploader { if (path == null) { log.error("无法获取已上传服务器文件地址"); CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); - return false; + throw new UploadGeneralException("无法获取已上传服务器文件地址"); +// return false; } try { Long alreadySize = UPLOADED_SIZE.get(uploadFile.getIdentifier()); @@ -220,12 +228,14 @@ public class FastDFSUploader extends Uploader { } catch (Exception e) { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.error("更新远程文件出错", e); - return false; + throw new UploadGeneralException("更新远程文件出错", e); +// return false; } } } catch (Exception e) { log.error("上传文件错误", e); - return false; + throw new UploadGeneralException("上传文件错误", e); +// return false; } } finally { // 锁的当前拥有者才能释放块上传锁 @@ -235,6 +245,6 @@ public class FastDFSUploader extends Uploader { } } log.info("***********第{}块上传成功**********", uploadFile.getChunkNumber()); - return true; +// return true; } } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java index f3cc6f7..81a8d78 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java @@ -28,7 +28,7 @@ public class TaskController { @Scheduled(cron = "0 0/1 * * * ?") public void deleteFile() { - log.info("111112"); + LambdaQueryWrapper fileBeanLambdaQueryWrapper = new LambdaQueryWrapper<>(); fileBeanLambdaQueryWrapper.eq(FileBean::getPointCount, 0); @@ -39,8 +39,7 @@ public class TaskController { fileService.deleteLocalFile(fileBean); fileService.removeById(fileBean.getFileId()); } - fileService.remove(fileBeanLambdaQueryWrapper); +// fileService.remove(fileBeanLambdaQueryWrapper); - log.info("11111"); } } From 716e66b394d1293078ff0e88d540f728967f189e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Tue, 16 Mar 2021 20:42:22 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiwenshare/common/util/JedisConfig.java | 403 ------------------ .../qiwenshare/common/util/RandomUtil.java | 24 -- .../advice/GlobalExceptionHandlerAdvice.java | 6 + .../qiwenshare/file/api/IUserFileService.java | 2 +- .../file/controller/FileController.java | 28 +- .../file/controller/ShareController.java | 4 +- .../qiwenshare/file/dto/DeleteFileDTO.java | 5 + .../file/service/RecoveryFileService.java | 63 +++ .../file/service/UserFileService.java | 78 +++- 9 files changed, 154 insertions(+), 459 deletions(-) delete mode 100644 file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/util/RandomUtil.java diff --git a/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java b/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java deleted file mode 100644 index 1e8b64b..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/util/JedisConfig.java +++ /dev/null @@ -1,403 +0,0 @@ -//package com.qiwenshare.common.util; -// -//import cn.hutool.core.util.StrUtil; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import redis.clients.jedis.Jedis; -//import redis.clients.jedis.JedisPool; -//import redis.clients.jedis.JedisPoolConfig; -// -//import java.util.List; -// -///** -// * @Description: JedisConfig -// * @ClassName: JedisConfig -// * @Author: xxx -// * @Date: 2019/12/31 16:23 -// * @Version: 1.0 -// */ -//public class JedisConfig { -// -// private static Logger logger = LoggerFactory.getLogger(JedisConfig.class); -// -// protected static final ThreadLocal threadLocalJedis = new ThreadLocal<>(); -// private static JedisPool jedisPool; -// /** -// * Redis服务器IP -// */ -// private static String ADDR_ARRAY = "192.168.1.122"; -// -// /** -// * Redis的端口号 -// */ -// private static int PORT = 6379; -// -// /** -// * 访问密码 -// */ -// private static String AUTH = "123456"; -// -// /** -// * 可用连接实例的最大数目,默认值为8 -// * 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 -// */ -// private static int MAX_ACTIVE = -1; -// -// /** -// * 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 -// */ -// private static int MAX_IDLE = 16; -// -// /** -// * 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; -// */ -// private static int MAX_WAIT = 1000 * 5; -// -// // 超时时间 -// private static int TIMEOUT = 1000 * 5; -// -// /** -// * 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; -// */ -// private static boolean TEST_ON_BORROW = true; -// -// /** -// * redis过期时间,以秒为单位 -// */ -// /** -// * 一小时 -// */ -// public final static int EXRP_HOUR = 60 * 60; -// /** -// * 一天 -// */ -// public final static int EXRP_DAY = 60 * 60 * 24; -// /** -// * 一个月 -// */ -// public final static int EXRP_MONTH = 60 * 60 * 24 * 30; -// -// public JedisConfig() { -// } -// -// static { -// initialPool(); -// } -// -// /** -// * 初始化Redis连接池,注意一定要在使用前初始化一次,一般在项目启动时初始化就行了 -// */ -// public static JedisPool initialPool() { -// JedisPool jp = null; -// try { -// JedisPoolConfig config = new JedisPoolConfig(); -// config.setMaxTotal(MAX_ACTIVE); -// config.setMaxIdle(MAX_IDLE); -// config.setMaxWaitMillis(MAX_WAIT); -// config.setTestOnBorrow(TEST_ON_BORROW); -// config.setTestOnCreate(true); -// config.setTestWhileIdle(true); -// config.setTestOnReturn(true); -// config.setNumTestsPerEvictionRun(-1); -// jp = new JedisPool(config, ADDR_ARRAY, PORT, TIMEOUT, AUTH); -// jedisPool = jp; -// threadLocalJedis.set(getJedis()); -// } catch (Exception e) { -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// } -// return jp; -// } -// -// /** -// * 获取Jedis实例,一定先初始化 -// * @return Jedis -// */ -// public static Jedis getJedis() { -// boolean success = false; -// Jedis jedis = null; -// int i=0; -// while (!success) { -// i++; -// try { -// if (jedisPool != null) { -// jedis = threadLocalJedis.get(); -// if (jedis == null){ -// jedis = jedisPool.getResource(); -// }else { -// if(!jedis.isConnected() && !jedis.getClient().isBroken()){ -// threadLocalJedis.set(null); -// jedis = jedisPool.getResource(); -// } -// return jedis; -// } -// }else { -// throw new RuntimeException("redis连接池初始化失败"); -// } -// } catch (Exception e) { -// System.out.println(Thread.currentThread().getName()+":第"+i+"次获取失败!!!"); -// success = false; -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// } -// if (jedis != null){ -// success = true; -// } -// if (i >= 10 && i < 20){ -// try { -// Thread.sleep(1000); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } -// if (i >= 20 && i < 30){ -// try { -// Thread.sleep(2000); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// -// } -// if (i >= 30 && i < 40){ -// try { -// Thread.sleep(3000); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } -// if (i >= 40){ -// System.out.println("redis彻底连不上了~~~~(>_<)~~~~"); -// return null; -// } -// } -// if (threadLocalJedis.get() == null) { -// threadLocalJedis.set(jedis); -// } -// return jedis; -// } -// -// /** -// * 设置 String -// * @param key -// * @param value -// */ -// public static void setString(String key, String value) { -// Jedis jo = null; -// try { -// value = StrUtil.isBlank(value) ? "" : value; -// jo = getJedis(); -// jo.set(key, value); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis服务器异常"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// /** -// * 设置 过期时间 -// * @param key -// * @param seconds 以秒为单位 -// * @param value -// */ -// public static void setString(String key, int seconds, String value) { -// Jedis jo = null; -// try { -// value = StrUtil.isBlank(value) ? "" : value; -// jo = getJedis(); -// jo.setex(key, seconds, value); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis服务器异常"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// -// -// } -// -// /** -// * 获取String值 -// * @param key -// * @return value -// */ -// public static String getString(String key) { -// Jedis jo = null; -// try { -// jo = getJedis(); -// if (jo == null || !jo.exists(key)) { -// return null; -// } -// return jo.get(key); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// public static long incrBy(String key, long integer) { -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.incrBy(key, integer); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// public static long decrBy(String key, long integer) { -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.decrBy(key, integer); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// /** -// * 删除多个key -// */ -// public static long delKeys(String [] keys){ -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.del(keys); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// -// } -// -// /** -// * 删除单个key -// */ -// public static long delKey(String key){ -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.del(key); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// -// } -// -// /** -// * 添加到队列尾 -// */ -// public static long rpush(String key,String node){ -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.rpush(key,node); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// /** -// * 删除list元素 -// */ -// public static long delListNode(String key,int count,String value){ -// Jedis jo = null; -// try { -// jo = getJedis(); -// return jo.lrem(key,count,value); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// } -// -// /** -// * 获取所有list -// */ -// public static List getListAll(String key){ -// Jedis jo = null; -// List list=null; -// try { -// jo = getJedis(); -// list= jo.lrange(key,0,-1); -// } catch (Exception e) { -// threadLocalJedis.set(null); -// e.printStackTrace(); -// logger.error("redis服务器异常",e); -// throw new RuntimeException("redis操作错误"); -// } finally { -// if (jo != null) { -// close(jo); -// } -// } -// return list; -// } -// -// /** -// * 清理缓存redis -// */ -// public void cleanLoacl(Jedis jo){ -// threadLocalJedis.set(null); -// close(jo); -// } -// -// public static void close(Jedis jedis) { -// if (threadLocalJedis.get() == null && jedis != null){ -// jedis.close(); -// } -// } -//} \ No newline at end of file diff --git a/file-common/src/main/java/com/qiwenshare/common/util/RandomUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/RandomUtil.java deleted file mode 100644 index c31dd19..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/util/RandomUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.qiwenshare.common.util; - -import java.util.Random; - -public class RandomUtil { - public static String getStringRandom(int length) { - - String val = ""; - Random random = new Random(); - //参数length,表示生成几位随机数 - for(int i = 0; i < length; i++) { - String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; - //输出字母还是数字 - if("char".equalsIgnoreCase(charOrNum)){ - //输出是大写字母还是小写字母 - int temp = random.nextInt(2) % 2 == 0 ? 65 : 97; - val += (char)(random.nextInt(26) + temp); - }else if("num".equalsIgnoreCase(charOrNum)) { - val += String.valueOf(random.nextInt(10)); - } - } - return val; - } -} diff --git a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java index 297fd6d..d702b3c 100644 --- a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java +++ b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java @@ -3,9 +3,11 @@ package com.qiwenshare.file.advice; import com.qiwenshare.common.cbb.RestResult; import com.qiwenshare.common.cbb.ResultCodeEnum; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.client.HttpClientErrorException; /** @@ -20,6 +22,7 @@ public class GlobalExceptionHandlerAdvice { /**-------- 通用异常处理方法 --------**/ @ExceptionHandler(Exception.class) @ResponseBody + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestResult error(Exception e) { e.printStackTrace(); log.error("全局异常捕获:" + e); @@ -30,6 +33,7 @@ public class GlobalExceptionHandlerAdvice { /**-------- 指定异常处理方法 --------**/ @ExceptionHandler(NullPointerException.class) @ResponseBody + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestResult error(NullPointerException e) { e.printStackTrace(); log.error("全局异常捕获:" + e); @@ -38,6 +42,7 @@ public class GlobalExceptionHandlerAdvice { /**-------- 下标越界处理方法 --------**/ @ExceptionHandler(IndexOutOfBoundsException.class) @ResponseBody + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestResult error(IndexOutOfBoundsException e) { e.printStackTrace(); log.error("全局异常捕获:" + e); @@ -47,6 +52,7 @@ public class GlobalExceptionHandlerAdvice { /**-------- 自定义定异常处理方法 --------**/ @ExceptionHandler(CMSException.class) @ResponseBody + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public RestResult error(CMSException e) { e.printStackTrace(); log.error("全局异常捕获:" + e); diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IUserFileService.java b/file-web/src/main/java/com/qiwenshare/file/api/IUserFileService.java index c5d72e7..88a1b26 100644 --- a/file-web/src/main/java/com/qiwenshare/file/api/IUserFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/api/IUserFileService.java @@ -21,6 +21,6 @@ public interface IUserFileService extends IService { Long selectCountNotInExtendNames(List fileNameList, Long beginCount, Long pageCount, long userId); List selectFileTreeListLikeFilePath(String filePath, long userId); List selectFilePathTreeByUserId(Long userId); - void deleteUserFile(UserFile userFile, UserBean sessionUserBean); + void deleteUserFile(Long userFileId, Long sessionUserId); } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index f362f7f..e9b2397 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -206,15 +206,9 @@ public class FileController { List userFiles = JSON.parseArray(batchDeleteFileDto.getFiles(), UserFile.class); DigestUtils.md5Hex("data"); for (UserFile userFile : userFiles) { - String uuid = UUID.randomUUID().toString(); - userFile.setDeleteBatchNum(uuid); - userFileService.deleteUserFile(userFile,sessionUserBean); - RecoveryFile recoveryFile = new RecoveryFile(); - recoveryFile.setUserFileId(userFile.getUserFileId()); - recoveryFile.setDeleteTime(DateUtil.getCurrentTime()); - recoveryFile.setDeleteBatchNum(uuid); - recoveryFileService.save(recoveryFile); + //userFile.setDeleteBatchNum(uuid); + userFileService.deleteUserFile(userFile.getUserFileId(),sessionUserBean.getUserId()); } return RestResult.success().message("批量删除文件成功"); @@ -230,20 +224,16 @@ public class FileController { return operationCheck(token); } - String uuid = UUID.randomUUID().toString(); UserBean sessionUserBean = userService.getUserBeanByToken(token); - UserFile userFile = new UserFile(); - userFile.setUserFileId(deleteFileDto.getUserFileId()); - userFile.setDeleteBatchNum(uuid); - BeanUtil.copyProperties(deleteFileDto, userFile); - userFileService.deleteUserFile(userFile, sessionUserBean); +// String uuid = UUID.randomUUID().toString(); + +// UserFile userFile = new UserFile(); +// userFile.setUserFileId(deleteFileDto.getUserFileId()); +//// userFile.setDeleteBatchNum(uuid); +// BeanUtil.copyProperties(deleteFileDto, userFile); + userFileService.deleteUserFile(deleteFileDto.getUserFileId(), sessionUserBean.getUserId()); - RecoveryFile recoveryFile = new RecoveryFile(); - recoveryFile.setUserFileId(deleteFileDto.getUserFileId()); - recoveryFile.setDeleteTime(DateUtil.getCurrentTime()); - recoveryFile.setDeleteBatchNum(uuid); - recoveryFileService.save(recoveryFile); return RestResult.success(); } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java b/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java index 24746ef..53e4762 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java @@ -1,11 +1,11 @@ package com.qiwenshare.file.controller; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.qiwenshare.common.cbb.DateUtil; import com.qiwenshare.common.cbb.RestResult; -import com.qiwenshare.common.util.RandomUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IShareService; import com.qiwenshare.file.api.IUserService; @@ -46,7 +46,7 @@ public class ShareController { public RestResult shareFile(ShareFileDTO shareSecretDTO, @RequestHeader("token") String token) { ShareFileVO shareSecretVO = new ShareFileVO(); UserBean sessionUserBean = userService.getUserBeanByToken(token); - String extractionCode = RandomUtil.getStringRandom(6); + String extractionCode = RandomUtil.randomNumbers(6); String uuid = UUID.randomUUID().toString(); Share share = new Share(); BeanUtil.copyProperties(sessionUserBean, share); diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java index d332468..40f61cd 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java @@ -8,10 +8,15 @@ import lombok.Data; public class DeleteFileDTO { @Schema(description = "用户文件id") private Long userFileId; + + @Schema(description = "文件路径") + @Deprecated private String filePath; @Schema(description = "文件名") + @Deprecated private String fileName; @Schema(description = "是否是目录") + @Deprecated private Integer isDir; } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java index 62f0167..b499df9 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java @@ -1,9 +1,11 @@ package com.qiwenshare.file.service; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.api.IRecoveryFileService; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.RecoveryFile; @@ -56,6 +58,67 @@ public class RecoveryFileService extends ServiceImpl userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); +// userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 0) +// .set(UserFile::getDeleteBatchNum, "") +// .eq(UserFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); +// userFileService.update(userFileLambdaUpdateWrapper); +// +// String filePath = PathUtil.getParentPath(restoreFileDto.getFilePath()); +// while(filePath.indexOf("/") != -1) { +// String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); +// filePath = PathUtil.getParentPath(filePath); +// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper.eq(UserFile::getFilePath, filePath + "/") +// .eq(UserFile::getDeleteFlag, 0) +// .eq(UserFile::getUserId, sessionUserBean.getUserId()); +// List userFileList = userFileService.list(lambdaQueryWrapper); +// if (userFileList.size() == 0) { +// UserFile userFile = new UserFile(); +// userFile.setUserId(sessionUserBean.getUserId()); +// userFile.setFileName(fileName); +// userFile.setFilePath(filePath + "/"); +// userFile.setDeleteFlag(0); +// userFile.setIsDir(1); +// userFile.setUploadTime(DateUtil.getCurrentTime()); +// +// userFileService.save(userFile); +// } +// +// } +// +// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// +// lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath) +// .likeRight(UserFile::getFilePath, restoreFileDto.getFilePath()) +// .eq(UserFile::getIsDir, 1) +// .eq(UserFile::getDeleteFlag, 0) +// .groupBy(UserFile::getFilePath, UserFile::getFileName) +// .having("count(fileName) >= 2"); +// List repeatList = userFileService.list(lambdaQueryWrapper); +// +// for (UserFile userFile : repeatList) { +// LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath()) +// .eq(UserFile::getFileName, userFile.getFileName()) +// .eq(UserFile::getDeleteFlag, "0"); +// List userFiles = userFileService.list(lambdaQueryWrapper1); +// log.info("重复的文件:" + JSON.toJSONString(userFiles)); +// for (int i = 0; i < userFiles.size() - 1; i ++) { +// log.info("删除文件:" + JSON.toJSONString(userFiles.get(i))); +// userFileService.removeById(userFiles.get(i).getUserFileId()); +// } +// } +// +// log.info(JSON.toJSONString(repeatList)); +// +// LambdaQueryWrapper recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); +// recoveryFileService.remove(recoveryFileServiceLambdaQueryWrapper); +// } + private void updateFilePointCountByBatchNum(String deleteBatchNum) { diff --git a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java index 6611dc1..c716042 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java @@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.oss.AliyunOSSRename; import com.qiwenshare.file.api.IUserFileService; import com.qiwenshare.file.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; +import com.qiwenshare.file.domain.RecoveryFile; import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.mapper.FileMapper; +import com.qiwenshare.file.mapper.RecoveryFileMapper; import com.qiwenshare.file.mapper.UserFileMapper; import com.qiwenshare.file.vo.file.FileListVo; import lombok.extern.slf4j.Slf4j; @@ -18,6 +21,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.Map; +import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -29,6 +33,8 @@ public class UserFileService extends ServiceImpl impl @Resource FileMapper fileMapper; @Resource + RecoveryFileMapper recoveryFileMapper; + @Resource FiletransferService filetransferService; @Resource QiwenFileConfig qiwenFileConfig; @@ -56,7 +62,53 @@ public class UserFileService extends ServiceImpl impl return userFileMapper.userFileList(userFile, beginCount, pageCount); } + public void renameUserFile(Long userFileId, String newFileName, Long userId) { + UserFile userFile = userFileMapper.selectById(userFileId); + if (1 == userFile.getIsDir()) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) + .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) + .eq(UserFile::getUserFileId, userFile.getUserFileId()); + userFileMapper.update(null, lambdaUpdateWrapper); + replaceUserFilePath(userFile.getFilePath() + newFileName + "/", + userFile.getFilePath() + userFile.getFileName() + "/", userId); + } else { + FileBean fileBean = fileMapper.selectById(userFile.getFileId()); + if (fileBean.getIsOSS() == 1) { +// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper.eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); +// UserFile userFile = userFileService.getOne(lambdaQueryWrapper); +// +// FileBean file = fileService.getById(userFile.getFileId()); + String fileUrl = fileBean.getFileUrl(); + String newFileUrl = fileUrl.replace(userFile.getFileName(), newFileName); + AliyunOSSRename.rename(qiwenFileConfig.getAliyun().getOss(), + fileUrl.substring(1), + newFileUrl.substring(1)); + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper + .set(FileBean::getFileUrl, newFileUrl) + .eq(FileBean::getFileId, fileBean.getFileId()); + fileMapper.update(null, lambdaUpdateWrapper); + + LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + userFileLambdaUpdateWrapper + .set(UserFile::getFileName, newFileName) + .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) + .eq(UserFile::getUserFileId, userFileId); + userFileMapper.update(null, userFileLambdaUpdateWrapper); + } else { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) + .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) + .eq(UserFile::getUserFileId, userFileId); + userFileMapper.update(null, lambdaUpdateWrapper); + } + + + } + } @Override public void updateFilepathByFilepath(String oldfilePath, String newfilePath, String fileName, String extendName) { @@ -131,37 +183,43 @@ public class UserFileService extends ServiceImpl impl @Override - public void deleteUserFile(UserFile userFile, UserBean sessionUserBean) { - + public void deleteUserFile(Long userFileId, Long sessionUserId) { +// UserFile userFile + UserFile userFile = userFileMapper.selectById(userFileId); + String uuid = UUID.randomUUID().toString(); if (userFile.getIsDir() == 1) { LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper(); userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 1) - .set(UserFile::getDeleteBatchNum, userFile.getDeleteBatchNum()) + .set(UserFile::getDeleteBatchNum, uuid) .set(UserFile::getDeleteTime, DateUtil.getCurrentTime()) - .eq(UserFile::getUserFileId, userFile.getUserFileId()); + .eq(UserFile::getUserFileId, userFileId); userFileMapper.update(null, userFileLambdaUpdateWrapper); String filePath = userFile.getFilePath() + userFile.getFileName() + "/"; - updateFileDeleteStateByFilePath(filePath, userFile.getDeleteBatchNum(), sessionUserBean.getUserId()); + updateFileDeleteStateByFilePath(filePath, userFile.getDeleteBatchNum(), sessionUserId); }else{ - UserFile userFileTemp = userFileMapper.selectById(userFile.getUserFileId()); + UserFile userFileTemp = userFileMapper.selectById(userFileId); FileBean fileBean = fileMapper.selectById(userFileTemp.getFileId()); LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 1) .set(UserFile::getDeleteTime, DateUtil.getCurrentTime()) - .set(UserFile::getDeleteBatchNum, userFile.getDeleteBatchNum()) + .set(UserFile::getDeleteBatchNum, uuid) .eq(UserFile::getUserFileId, userFileTemp.getUserFileId()); userFileMapper.update(null, userFileLambdaUpdateWrapper); -// LambdaUpdateWrapper fileBeanLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); -// fileBeanLambdaUpdateWrapper.set(FileBean::getPointCount, fileBean.getPointCount() -1) -// .eq(FileBean::getFileId, fileBean.getFileId()); } + RecoveryFile recoveryFile = new RecoveryFile(); + recoveryFile.setUserFileId(userFileId); + recoveryFile.setDeleteTime(DateUtil.getCurrentTime()); + recoveryFile.setDeleteBatchNum(uuid); + recoveryFileMapper.insert(recoveryFile); + + } private void updateFileDeleteStateByFilePath(String filePath, String deleteBatchNum, Long userId) { From bca2335d0cdcf83991ab41b677da316e571c75f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Tue, 16 Mar 2021 23:36:04 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/qiwenshare/common/cbb/DateUtil.java | 1 + .../qiwenshare/common/cbb/ResultCodeEnum.java | 1 + .../factory/AliyunOSSUploaderFactory.java | 6 ++++ .../upload/factory/ChunkUploaderFactory.java | 6 ++++ .../factory/FastDFSUploaderFactory.java | 6 ++++ .../upload/factory/NormalUploaderFactory.java | 6 ++++ .../upload/factory/UploaderFactory.java | 2 ++ .../common/upload/product/ChunkUploader.java | 21 ------------ .../upload/product/FastDFSUploader.java | 32 ++++--------------- .../advice/GlobalExceptionHandlerAdvice.java | 10 ++++++ .../file/controller/TaskController.java | 3 -- .../file/service/FiletransferService.java | 17 ++++++---- 12 files changed, 56 insertions(+), 55 deletions(-) diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java b/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java index 1d4bb4c..cb8edbe 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java +++ b/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java @@ -7,6 +7,7 @@ import java.util.Calendar; import java.util.Date; public class DateUtil { + /** * 获取系统当前时间 * diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java b/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java index bdecd43..1285a9d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java +++ b/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java @@ -12,6 +12,7 @@ public enum ResultCodeEnum { PARAM_ERROR(false,20002,"参数错误"), NULL_POINT(false, 20003, "空指针异常"), INDEX_OUT_OF_BOUNDS(false, 20004, "下标越界异常"), + REQUEST_TIMEOUT(false, 20005, "请求超时"), ; // 响应是否成功 diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java index 685c4cb..7620ea6 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java @@ -1,5 +1,6 @@ package com.qiwenshare.common.upload.factory; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.AliyunOSSUploader; import com.qiwenshare.common.upload.Uploader; @@ -15,4 +16,9 @@ public class AliyunOSSUploaderFactory implements UploaderFactory { public Uploader getUploader(UploadFile uploadFile) { return new AliyunOSSUploader(uploadFile); } + + @Override + public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { + return null; + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java index 62be6fb..228b4a7 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java @@ -1,5 +1,6 @@ package com.qiwenshare.common.upload.factory; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.ChunkUploader; import com.qiwenshare.common.upload.Uploader; @@ -16,5 +17,10 @@ public class ChunkUploaderFactory implements UploaderFactory { return new ChunkUploader(uploadFile); } + @Override + public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { + return null; + } + } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java index 975d3cd..439e474 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java @@ -1,5 +1,6 @@ package com.qiwenshare.common.upload.factory; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.product.FastDFSUploader; @@ -14,4 +15,9 @@ public class FastDFSUploaderFactory implements UploaderFactory { public Uploader getUploader(UploadFile uploadFile) { return new FastDFSUploader(uploadFile); } + + @Override + public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { + return new FastDFSUploader(uploadFile, appendFileStorageClient); + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java index c1a4b5a..349b66e 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java @@ -1,5 +1,6 @@ package com.qiwenshare.common.upload.factory; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.NormalUploader; import com.qiwenshare.common.upload.Uploader; @@ -15,4 +16,9 @@ public class NormalUploaderFactory implements UploaderFactory { public Uploader getUploader(UploadFile uploadFile) { return new NormalUploader(); } + + @Override + public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { + return null; + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java index 7d421d5..f48a550 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java @@ -1,9 +1,11 @@ package com.qiwenshare.common.upload.factory; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.Uploader; public interface UploaderFactory { Uploader getUploader(); Uploader getUploader(UploadFile uploadFile); + Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient); } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java index 6e530dd..d9e0afe 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java @@ -44,11 +44,6 @@ public class ChunkUploader extends Uploader { boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); -// UploadFile uploadFile = new UploadFile(); -// uploadFile.setSuccess(0); -// uploadFile.setMessage("未包含文件上传域"); -// saveUploadFileList.add(uploadFile); -// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); @@ -63,34 +58,18 @@ public class ChunkUploader extends Uploader { saveUploadFileList = doUpload(savePath, iter); } } catch (IOException e) { -// UploadFile uploadFile = new UploadFile(); -// uploadFile.setSuccess(1); -// uploadFile.setMessage("未知错误"); -// saveUploadFileList.add(uploadFile); -// e.printStackTrace(); throw new UploadGeneralException("未包含文件上传域"); } catch (NotSameFileExpection notSameFileExpection) { notSameFileExpection.printStackTrace(); } - - return saveUploadFileList; - - } private List doUpload(String savePath, Iterator iter) throws IOException, NotSameFileExpection { List saveUploadFileList = new ArrayList(); - //UploadFile uploadFile = new UploadFile(); MultipartFile multipartfile = this.request.getFile(iter.next()); - //InputStream inputStream = multipartfile.getInputStream(); String timeStampName = uploadFile.getIdentifier(); -// .getTimeStampName(); -// if (StringUtils.isEmpty(uploadFile.getTimeStampName())) { -// timeStampName = getTimeStampName(); -// } - String originalName = multipartfile.getOriginalFilename(); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java index fc2a838..1558561 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java @@ -17,13 +17,10 @@ import org.springframework.web.multipart.support.StandardMultipartHttpServletReq import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.io.IOException; import java.util.*; @Slf4j -@Component public class FastDFSUploader extends Uploader { - @Resource AppendFileStorageClient defaultAppendFileStorageClient; UploadFile uploadFile; @@ -41,6 +38,11 @@ public class FastDFSUploader extends Uploader { this.uploadFile = uploadFile; } + public FastDFSUploader(UploadFile uploadFile, AppendFileStorageClient defaultAppendFileStorageClient) { + this.uploadFile = uploadFile; + this.defaultAppendFileStorageClient = defaultAppendFileStorageClient; + } + @Override public List upload(HttpServletRequest request) { @@ -52,11 +54,6 @@ public class FastDFSUploader extends Uploader { boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); -// UploadFile uploadFile = new UploadFile(); -// uploadFile.setSuccess(0); -// uploadFile.setMessage("未包含文件上传域"); -// saveUploadFileList.add(uploadFile); -// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); @@ -68,16 +65,10 @@ public class FastDFSUploader extends Uploader { sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 Iterator iter = this.request.getFileNames(); while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); } } catch (Exception e) { throw new UploadGeneralException(e); -// UploadFile uploadFile = new UploadFile(); -// uploadFile.setSuccess(1); -// uploadFile.setMessage("未知错误"); -// saveUploadFileList.add(uploadFile); -// e.printStackTrace(); } log.info("结束上传"); @@ -124,7 +115,6 @@ public class FastDFSUploader extends Uploader { } catch (Exception e) { throw new UploadGeneralException(e); -// log.error("上传出错:" + e); } uploadFile.setIsOSS(1); @@ -146,14 +136,8 @@ public class FastDFSUploader extends Uploader { try { Boolean lock = LOCK_MAP.get(uploadFile.getIdentifier()); -// -// if (lock == null){ -// log.info("请求块锁失败"); -// return false; -// } if (lock != null && lock) { throw new UploadGeneralException("请求块锁失败"); - //return false; } LOCK_MAP.put(uploadFile.getIdentifier(), true); // 写入锁的当前拥有者 @@ -187,7 +171,7 @@ public class FastDFSUploader extends Uploader { log.info("上传第一块"); CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber() + 1); try { - storePath = defaultAppendFileStorageClient.uploadAppenderFile("default_group", multipartFile.getInputStream(), + storePath = defaultAppendFileStorageClient.uploadAppenderFile("group1", multipartFile.getInputStream(), multipartFile.getSize(), FileUtil.getFileExtendName(multipartFile.getOriginalFilename())); // 记录第一个分片上传的大小 UPLOADED_SIZE.put(uploadFile.getIdentifier(), uploadFile.getCurrentChunkSize()); @@ -220,7 +204,7 @@ public class FastDFSUploader extends Uploader { try { Long alreadySize = UPLOADED_SIZE.get(uploadFile.getIdentifier()); // 追加方式实际实用如果中途出错多次,可能会出现重复追加情况,这里改成修改模式,即时多次传来重复文件块,依然可以保证文件拼接正确 - defaultAppendFileStorageClient.modifyFile("default_group", path, multipartFile.getInputStream(), + defaultAppendFileStorageClient.modifyFile("group1", path, multipartFile.getInputStream(), multipartFile.getSize(), alreadySize); // 记录分片上传的大小 UPLOADED_SIZE.put(uploadFile.getIdentifier(), alreadySize + multipartFile.getSize()); @@ -241,10 +225,8 @@ public class FastDFSUploader extends Uploader { // 锁的当前拥有者才能释放块上传锁 if (currOwner) { LOCK_MAP.put(uploadFile.getIdentifier(), false); - //JedisConfig.setString(chunkLockName, "0"); } } log.info("***********第{}块上传成功**********", uploadFile.getChunkNumber()); -// return true; } } diff --git a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java index d702b3c..9b526ea 100644 --- a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java +++ b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java @@ -2,6 +2,7 @@ package com.qiwenshare.file.advice; import com.qiwenshare.common.cbb.RestResult; import com.qiwenshare.common.cbb.ResultCodeEnum; +import com.qiwenshare.common.exception.UploadGeneralException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -49,6 +50,15 @@ public class GlobalExceptionHandlerAdvice { return RestResult.setResult(ResultCodeEnum.INDEX_OUT_OF_BOUNDS); } + @ExceptionHandler(UploadGeneralException.class) + @ResponseBody + @ResponseStatus(HttpStatus.REQUEST_TIMEOUT) + public RestResult error(UploadGeneralException e) { + e.printStackTrace(); + log.error("全局异常捕获:" + e); + return RestResult.setResult(ResultCodeEnum.REQUEST_TIMEOUT); + } + /**-------- 自定义定异常处理方法 --------**/ @ExceptionHandler(CMSException.class) @ResponseBody diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java index 81a8d78..20e40c5 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java @@ -20,9 +20,6 @@ import java.util.List; @Controller public class TaskController { - @Resource - UserFileService userFileService; - @Resource FileService fileService; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index ee5caa1..e2ed934 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletRequest; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.cbb.DateUtil; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.factory.AliyunOSSUploaderFactory; @@ -40,6 +41,8 @@ public class FiletransferService implements IFiletransferService { QiwenFileConfig qiwenFileConfig; @Resource UserFileMapper userFileMapper; + @Resource + AppendFileStorageClient defaultAppendFileStorageClient; @@ -56,12 +59,14 @@ public class FiletransferService implements IFiletransferService { uploadFile.setIdentifier(UploadFileDto.getIdentifier()); uploadFile.setTotalSize(UploadFileDto.getTotalSize()); uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); - if (oss.isEnabled()) { - uploader = new AliyunOSSUploaderFactory().getUploader(uploadFile); - } else if ("FastFDS".equals(storyType)) { - uploader = new FastDFSUploaderFactory().getUploader(uploadFile); - } else { - uploader = new ChunkUploaderFactory().getUploader(uploadFile); + synchronized (FiletransferService.class) { + if (oss.isEnabled()) { + uploader = new AliyunOSSUploaderFactory().getUploader(uploadFile); + } else if ("FastFDS".equals(storyType)) { + uploader = new FastDFSUploaderFactory().getUploader(uploadFile, defaultAppendFileStorageClient); + } else { + uploader = new ChunkUploaderFactory().getUploader(uploadFile); + } } List uploadFileList = uploader.upload(request); From 036048261020dae333227aa56e12556bf324caa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Thu, 18 Mar 2021 20:48:15 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/AliyunOSSUploaderFactory.java | 9 +- .../upload/factory/ChunkUploaderFactory.java | 9 +- .../factory/FastDFSUploaderFactory.java | 13 +- .../upload/factory/NormalUploaderFactory.java | 8 +- .../upload/factory/UploaderFactory.java | 1 - .../com/qiwenshare/file/FileApplication.java | 7 ++ .../controller/FiletransferController.java | 88 +++++++++++++ .../qiwenshare/file/dto/DownloadFileDTO.java | 10 ++ .../file/service/FiletransferService.java | 14 ++- .../file/service/RecoveryFileService.java | 118 +++++++++--------- 10 files changed, 195 insertions(+), 82 deletions(-) create mode 100644 file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java index 7620ea6..2661666 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java @@ -4,9 +4,14 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.AliyunOSSUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; +@Component public class AliyunOSSUploaderFactory implements UploaderFactory { + @Override public Uploader getUploader() { return new AliyunOSSUploader(); @@ -17,8 +22,4 @@ public class AliyunOSSUploaderFactory implements UploaderFactory { return new AliyunOSSUploader(uploadFile); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java index 228b4a7..830104a 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java @@ -4,7 +4,11 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.ChunkUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class ChunkUploaderFactory implements UploaderFactory { @Override @@ -17,10 +21,5 @@ public class ChunkUploaderFactory implements UploaderFactory { return new ChunkUploader(uploadFile); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } - } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java index 439e474..5e6a80f 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java @@ -4,8 +4,15 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.product.FastDFSUploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class FastDFSUploaderFactory implements UploaderFactory { + + @Resource + AppendFileStorageClient defaultAppendFileStorageClient; @Override public Uploader getUploader() { return new FastDFSUploader(); @@ -13,11 +20,7 @@ public class FastDFSUploaderFactory implements UploaderFactory { @Override public Uploader getUploader(UploadFile uploadFile) { - return new FastDFSUploader(uploadFile); + return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return new FastDFSUploader(uploadFile, appendFileStorageClient); - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java index 349b66e..145dfa7 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java @@ -4,7 +4,11 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.NormalUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class NormalUploaderFactory implements UploaderFactory { @Override @@ -17,8 +21,4 @@ public class NormalUploaderFactory implements UploaderFactory { return new NormalUploader(); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java index f48a550..99a4793 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java @@ -7,5 +7,4 @@ import com.qiwenshare.common.upload.Uploader; public interface UploaderFactory { Uploader getUploader(); Uploader getUploader(UploadFile uploadFile); - Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient); } diff --git a/file-web/src/main/java/com/qiwenshare/file/FileApplication.java b/file-web/src/main/java/com/qiwenshare/file/FileApplication.java index 1c7bc5b..bb625b1 100644 --- a/file-web/src/main/java/com/qiwenshare/file/FileApplication.java +++ b/file-web/src/main/java/com/qiwenshare/file/FileApplication.java @@ -3,6 +3,8 @@ package com.qiwenshare.file; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -11,6 +13,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableScheduling //@EnableDiscoveryClient @EnableTransactionManagement +@ComponentScan(value = "com.qiwenshare", excludeFilters = @ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = { + } +)) public class FileApplication { public static void main(String[] args) { diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index ff229b3..cca748c 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -1,8 +1,13 @@ package com.qiwenshare.file.controller; +import com.aliyun.oss.OSS; +import com.aliyun.oss.model.OSSObject; import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.operation.FileOperation; +import com.qiwenshare.common.oss.AliyunOSSDownload; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.api.IFiletransferService; @@ -13,6 +18,7 @@ import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.domain.UserFile; +import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.vo.file.UploadFileVo; import io.swagger.v3.oas.annotations.Operation; @@ -22,6 +28,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -120,6 +128,86 @@ public class FiletransferController { } + /** + * 下载文件 + * + * @return + */ + @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"}) + @MyLog(operation = "下载文件", module = CURRENT_MODULE) + @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) + public String downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { + UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); + + String fileName = userFile.getFileName() + "." + userFile.getExtendName(); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 + byte[] buffer = new byte[1024]; + BufferedInputStream bis = null; + FileBean fileBean = fileService.getById(userFile.getFileId()); + if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { + + AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); + OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); + OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); + InputStream inputStream = ossObject.getObjectContent(); + try { + bis = new BufferedInputStream(inputStream); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + ossClient.shutdown(); + } else { + //设置文件路径 + File file = FileOperation.newFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); + if (file.exists()) { + + + FileInputStream fis = null; + + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + } + return null; + + } + @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"}) @RequestMapping(value = "/getstorage", method = RequestMethod.GET) @ResponseBody diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java new file mode 100644 index 0000000..83c7ae9 --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java @@ -0,0 +1,10 @@ +package com.qiwenshare.file.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "下载文件DTO",required = true) +public class DownloadFileDTO { + private Long userFileId; +} diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index e2ed934..aa8aead 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -15,6 +15,7 @@ import com.qiwenshare.common.upload.factory.AliyunOSSUploaderFactory; import com.qiwenshare.common.upload.factory.ChunkUploaderFactory; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.factory.FastDFSUploaderFactory; +import com.qiwenshare.common.upload.factory.UploaderFactory; import com.qiwenshare.file.api.IFiletransferService; import com.qiwenshare.common.domain.AliyunOSS; @@ -41,8 +42,13 @@ public class FiletransferService implements IFiletransferService { QiwenFileConfig qiwenFileConfig; @Resource UserFileMapper userFileMapper; + @Resource - AppendFileStorageClient defaultAppendFileStorageClient; + UploaderFactory fastDFSUploaderFactory; + @Resource + UploaderFactory aliyunOSSUploaderFactory; + @Resource + UploaderFactory chunkUploaderFactory; @@ -61,11 +67,11 @@ public class FiletransferService implements IFiletransferService { uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); synchronized (FiletransferService.class) { if (oss.isEnabled()) { - uploader = new AliyunOSSUploaderFactory().getUploader(uploadFile); + uploader = aliyunOSSUploaderFactory.getUploader(uploadFile); } else if ("FastFDS".equals(storyType)) { - uploader = new FastDFSUploaderFactory().getUploader(uploadFile, defaultAppendFileStorageClient); + uploader = fastDFSUploaderFactory.getUploader(uploadFile); } else { - uploader = new ChunkUploaderFactory().getUploader(uploadFile); + uploader = chunkUploaderFactory.getUploader(uploadFile); } } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java index b499df9..859c7b8 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java @@ -59,65 +59,65 @@ public class RecoveryFileService extends ServiceImpl userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); -// userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 0) -// .set(UserFile::getDeleteBatchNum, "") -// .eq(UserFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); -// userFileService.update(userFileLambdaUpdateWrapper); -// -// String filePath = PathUtil.getParentPath(restoreFileDto.getFilePath()); -// while(filePath.indexOf("/") != -1) { -// String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); -// filePath = PathUtil.getParentPath(filePath); -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper.eq(UserFile::getFilePath, filePath + "/") -// .eq(UserFile::getDeleteFlag, 0) -// .eq(UserFile::getUserId, sessionUserBean.getUserId()); -// List userFileList = userFileService.list(lambdaQueryWrapper); -// if (userFileList.size() == 0) { -// UserFile userFile = new UserFile(); -// userFile.setUserId(sessionUserBean.getUserId()); -// userFile.setFileName(fileName); -// userFile.setFilePath(filePath + "/"); -// userFile.setDeleteFlag(0); -// userFile.setIsDir(1); -// userFile.setUploadTime(DateUtil.getCurrentTime()); -// -// userFileService.save(userFile); -// } -// -// } -// -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// -// lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath) -// .likeRight(UserFile::getFilePath, restoreFileDto.getFilePath()) -// .eq(UserFile::getIsDir, 1) -// .eq(UserFile::getDeleteFlag, 0) -// .groupBy(UserFile::getFilePath, UserFile::getFileName) -// .having("count(fileName) >= 2"); -// List repeatList = userFileService.list(lambdaQueryWrapper); -// -// for (UserFile userFile : repeatList) { -// LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath()) -// .eq(UserFile::getFileName, userFile.getFileName()) -// .eq(UserFile::getDeleteFlag, "0"); -// List userFiles = userFileService.list(lambdaQueryWrapper1); -// log.info("重复的文件:" + JSON.toJSONString(userFiles)); -// for (int i = 0; i < userFiles.size() - 1; i ++) { -// log.info("删除文件:" + JSON.toJSONString(userFiles.get(i))); -// userFileService.removeById(userFiles.get(i).getUserFileId()); -// } -// } -// -// log.info(JSON.toJSONString(repeatList)); -// -// LambdaQueryWrapper recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>(); -// recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); -// recoveryFileService.remove(recoveryFileServiceLambdaQueryWrapper); -// } + public void restorefile(String deleteBatchNum, String filePath, Long sessionUserId) { + LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 0) + .set(UserFile::getDeleteBatchNum, "") + .eq(UserFile::getDeleteBatchNum, deleteBatchNum); + userFileMapper.update(null, userFileLambdaUpdateWrapper); + + String parentFilePath = PathUtil.getParentPath(filePath); + while(parentFilePath.indexOf("/") != -1) { + String fileName = parentFilePath.substring(parentFilePath.lastIndexOf("/") + 1); + parentFilePath = PathUtil.getParentPath(parentFilePath); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserFile::getFilePath, parentFilePath + "/") + .eq(UserFile::getDeleteFlag, 0) + .eq(UserFile::getUserId, sessionUserId); + List userFileList = userFileMapper.selectList(lambdaQueryWrapper); + if (userFileList.size() == 0) { + UserFile userFile = new UserFile(); + userFile.setUserId(sessionUserId); + userFile.setFileName(fileName); + userFile.setFilePath(parentFilePath + "/"); + userFile.setDeleteFlag(0); + userFile.setIsDir(1); + userFile.setUploadTime(DateUtil.getCurrentTime()); + + userFileMapper.insert(userFile); + } + + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + + lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath) + .likeRight(UserFile::getFilePath, filePath) + .eq(UserFile::getIsDir, 1) + .eq(UserFile::getDeleteFlag, 0) + .groupBy(UserFile::getFilePath, UserFile::getFileName) + .having("count(fileName) >= 2"); + List repeatList = userFileMapper.selectList(lambdaQueryWrapper); + + for (UserFile userFile : repeatList) { + LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); + lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath()) + .eq(UserFile::getFileName, userFile.getFileName()) + .eq(UserFile::getDeleteFlag, "0"); + List userFiles = userFileMapper.selectList(lambdaQueryWrapper1); + log.info("重复的文件:" + JSON.toJSONString(userFiles)); + for (int i = 0; i < userFiles.size() - 1; i ++) { + log.info("删除文件:" + JSON.toJSONString(userFiles.get(i))); + userFileMapper.deleteById(userFiles.get(i).getUserFileId()); + } + } + + log.info(JSON.toJSONString(repeatList)); + + LambdaQueryWrapper recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>(); + recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, deleteBatchNum); + recoveryFileMapper.delete(recoveryFileServiceLambdaQueryWrapper); + } From d9d306951394a1cc4b0eb9fbba46a422ad2dd5bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Thu, 18 Mar 2021 21:19:55 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=BC=8F=E6=8F=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/qiwenshare/common/upload/product/AliyunOSSUploader.java | 2 ++ file-web/src/main/resources/config/application.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java index 8d9518d..0e996dd 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java @@ -239,6 +239,8 @@ public class AliyunOSSUploader extends Uploader { getClient().abortMultipartUpload(abortMultipartUploadRequest); } + + @Override protected synchronized String getTimeStampName(){ String timeStampName; diff --git a/file-web/src/main/resources/config/application.properties b/file-web/src/main/resources/config/application.properties index b798ae6..6306424 100644 --- a/file-web/src/main/resources/config/application.properties +++ b/file-web/src/main/resources/config/application.properties @@ -52,7 +52,7 @@ mybatis-plus.global-config.banner=false qiwen-file.remote-login=false qiwen-file.share-mode=false #FastFDS -qiwen-file.storage-type=FastFDS +#qiwen-file.storage-type=FastFDS #是否启用阿里云oss qiwen-file.aliyun.oss.enabled=false From e1abac566c9bcbbf735fee7b15b059938bbad0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Fri, 19 Mar 2021 10:52:07 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiwenshare/file/controller/FiletransferController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index cca748c..b4725f1 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -140,6 +140,11 @@ public class FiletransferController { UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); String fileName = userFile.getFileName() + "." + userFile.getExtendName(); + try { + fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } response.setContentType("application/force-download");// 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 byte[] buffer = new byte[1024]; From 48cdbb8e0ff3d7e91662295795ad533604207942 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Fri, 19 Mar 2021 23:10:45 +0800 Subject: [PATCH 08/14] =?UTF-8?q?fdfs=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upload/product/FastDFSUploader.java | 76 ++++++----------- .../controller/FiletransferController.java | 81 ++++++++++--------- 2 files changed, 69 insertions(+), 88 deletions(-) diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java index 1558561..ff6e5a8 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java @@ -10,17 +10,16 @@ import com.qiwenshare.common.util.PathUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; -import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.*; @Slf4j public class FastDFSUploader extends Uploader { + public static Object lock = new Object(); AppendFileStorageClient defaultAppendFileStorageClient; UploadFile uploadFile; @@ -28,16 +27,12 @@ public class FastDFSUploader extends Uploader { private static Map CURRENT_UPLOAD_CHUNK_NUMBER = new HashMap<>(); private static Map UPLOADED_SIZE = new HashMap<>(); private static Map STORE_PATH = new HashMap<>(); - private static Map LOCK_MAP = new HashMap<>(); + private static Map LOCK_MAP = new HashMap<>(); public FastDFSUploader() { } - public FastDFSUploader(UploadFile uploadFile) { - this.uploadFile = uploadFile; - } - public FastDFSUploader(UploadFile uploadFile, AppendFileStorageClient defaultAppendFileStorageClient) { this.uploadFile = uploadFile; this.defaultAppendFileStorageClient = defaultAppendFileStorageClient; @@ -76,13 +71,17 @@ public class FastDFSUploader extends Uploader { } - - private List doUpload(String savePath, Iterator iter){ + private List doUpload(String savePath, Iterator iter) { List saveUploadFileList = new ArrayList<>(); try { MultipartFile multipartfile = this.request.getFile(iter.next()); + synchronized (lock) { + if (LOCK_MAP.get(uploadFile.getIdentifier()) == null) { + LOCK_MAP.put(uploadFile.getIdentifier(), new Object()); + } + } uploadFileChunk(multipartfile); String timeStampName = getTimeStampName(); @@ -100,11 +99,10 @@ public class FastDFSUploader extends Uploader { File confFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + confFilePath); - boolean isComplete = checkUploadStatus(uploadFile, confFile); if (isComplete) { log.info("分片上传完成"); - + LOCK_MAP.remove(uploadFile.getIdentifier()); uploadFile.setUrl(STORE_PATH.get(uploadFile.getIdentifier())); uploadFile.setSuccess(1); uploadFile.setMessage("上传成功"); @@ -126,40 +124,23 @@ public class FastDFSUploader extends Uploader { public void uploadFileChunk(MultipartFile multipartFile) { - // 存储在fastdfs不带组的路径 -// String noGroupPath = ""; - log.info("当前文件的Md5:{}", uploadFile.getIdentifier()); + synchronized (LOCK_MAP.get(uploadFile.getIdentifier())) { + // 存储在fastdfs不带组的路径 - // 真正的拥有者 - boolean currOwner = false; - - try { - - Boolean lock = LOCK_MAP.get(uploadFile.getIdentifier()); - if (lock != null && lock) { - throw new UploadGeneralException("请求块锁失败"); - } - LOCK_MAP.put(uploadFile.getIdentifier(), true); - // 写入锁的当前拥有者 - currOwner = true; - - // redis中记录当前应该传第几块(从0开始) - Integer currentChunkInRedis = CURRENT_UPLOAD_CHUNK_NUMBER.get(uploadFile.getIdentifier()); + log.info("当前文件的Md5:{}", uploadFile.getIdentifier()); log.info("当前块的大小:{}", uploadFile.getCurrentChunkSize()); - if (currentChunkInRedis == null) { - currentChunkInRedis = 1; + if (CURRENT_UPLOAD_CHUNK_NUMBER.get(uploadFile.getIdentifier()) == null) { + CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), 1); } - //此段代码保证顺序,如果满足条件则返回失败 - if (uploadFile.getChunkNumber() < currentChunkInRedis) { - log.info("当前文件块已上传"); - throw new UploadGeneralException("当前文件块已上传"); -// return false; - } else if (uploadFile.getChunkNumber() > currentChunkInRedis) { - log.info("当前文件块需要等待上传,稍后请重试"); - throw new UploadGeneralException("当前文件块需要等待上传,稍后请重试"); -// return false; + while (uploadFile.getChunkNumber() != CURRENT_UPLOAD_CHUNK_NUMBER.get(uploadFile.getIdentifier())) { + try { + LOCK_MAP.get(uploadFile.getIdentifier()).wait(); + } catch (InterruptedException e) { + log.error("--------InterruptedException-------"); + e.printStackTrace(); + } } log.info("***********开始上传第{}块**********", uploadFile.getChunkNumber()); @@ -180,13 +161,11 @@ public class FastDFSUploader extends Uploader { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.info("获取远程文件路径出错"); throw new UploadGeneralException("获取远程文件路径出错"); -// return false; } } catch (Exception e) { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.error("初次上传远程文件出错", e); throw new UploadGeneralException("初次上传远程文件出错", e); -// return false; } STORE_PATH.put(uploadFile.getIdentifier(), storePath.getPath()); @@ -199,7 +178,6 @@ public class FastDFSUploader extends Uploader { log.error("无法获取已上传服务器文件地址"); CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); throw new UploadGeneralException("无法获取已上传服务器文件地址"); -// return false; } try { Long alreadySize = UPLOADED_SIZE.get(uploadFile.getIdentifier()); @@ -213,20 +191,16 @@ public class FastDFSUploader extends Uploader { CURRENT_UPLOAD_CHUNK_NUMBER.put(uploadFile.getIdentifier(), uploadFile.getChunkNumber()); log.error("更新远程文件出错", e); throw new UploadGeneralException("更新远程文件出错", e); -// return false; } } } catch (Exception e) { log.error("上传文件错误", e); throw new UploadGeneralException("上传文件错误", e); -// return false; - } - } finally { - // 锁的当前拥有者才能释放块上传锁 - if (currOwner) { - LOCK_MAP.put(uploadFile.getIdentifier(), false); } + + log.info("***********第{}块上传成功**********", uploadFile.getChunkNumber()); + + LOCK_MAP.get(uploadFile.getIdentifier()).notifyAll(); } - log.info("***********第{}块上传成功**********", uploadFile.getChunkNumber()); } } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index b4725f1..72838f3 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -136,7 +136,7 @@ public class FiletransferController { @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"}) @MyLog(operation = "下载文件", module = CURRENT_MODULE) @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) - public String downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { + public void downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); String fileName = userFile.getFileName() + "." + userFile.getExtendName(); @@ -148,23 +148,36 @@ public class FiletransferController { response.setContentType("application/force-download");// 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 byte[] buffer = new byte[1024]; - BufferedInputStream bis = null; + FileBean fileBean = fileService.getById(userFile.getFileId()); if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { + aliyunDownload(response, buffer, fileBean); + } else { + localFileDownload(response, buffer, fileBean); + } + + } + + private void localFileDownload(HttpServletResponse response, byte[] buffer, FileBean fileBean) { + BufferedInputStream bis = null; + //设置文件路径 + File file = FileOperation.newFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); + if (file.exists()) { + + + FileInputStream fis = null; - AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); - OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); - OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); - InputStream inputStream = ossObject.getObjectContent(); try { - bis = new BufferedInputStream(inputStream); + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } - } catch (IOException e) { + + } catch (Exception e) { e.printStackTrace(); } finally { if (bis != null) { @@ -174,43 +187,37 @@ public class FiletransferController { e.printStackTrace(); } } - } - ossClient.shutdown(); - } else { - //设置文件路径 - File file = FileOperation.newFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); - if (file.exists()) { - - - FileInputStream fis = null; + } + } + private void aliyunDownload(HttpServletResponse response, byte[] buffer, FileBean fileBean) { + BufferedInputStream bis = null; + AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); + OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); + OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); + InputStream inputStream = ossObject.getObjectContent(); + try { + bis = new BufferedInputStream(inputStream); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { try { - fis = new FileInputStream(file); - bis = new BufferedInputStream(fis); - OutputStream os = response.getOutputStream(); - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } - - } catch (Exception e) { + bis.close(); + } catch (IOException e) { e.printStackTrace(); - } finally { - if (bis != null) { - try { - bis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } } } } - return null; - + ossClient.shutdown(); } @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"}) From 98a4ebe8f1cd7d3b3014e960c7637d76dc1cecff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Sat, 20 Mar 2021 17:05:55 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- file-common/pom.xml | 7 +++ .../common/config/RedisAutoConfiguration.java | 37 +++++++++++++ file-web/pom.xml | 10 ++-- .../file/api/IElasticSearchService.java | 8 +++ .../qiwenshare/file/config/es/FileSearch.java | 49 +++++++++++++++++ .../file/controller/FileController.java | 52 +++++++++++++++++-- .../controller/FiletransferController.java | 46 ++++++++++++++-- .../file/controller/TaskController.java | 33 +++++++++++- .../file/controller/UserController.java | 2 +- .../com/qiwenshare/file/dto/RegisterDTO.java | 15 ------ .../dto/{ => file}/BatchDeleteFileDTO.java | 2 +- .../file/dto/{ => file}/CreateFileDTO.java | 2 +- .../file/dto/{ => file}/DeleteFileDTO.java | 2 +- .../file/dto/{ => file}/RenameFileDTO.java | 2 +- .../file/dto/file/SearchFileDTO.java | 12 +++++ .../file/dto/{ => file}/UnzipFileDTO.java | 2 +- .../qiwenshare/file/dto/user/RegisterDTO.java | 11 +++- .../resources/config/application.properties | 24 +++++++++ 18 files changed, 279 insertions(+), 37 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/config/RedisAutoConfiguration.java create mode 100644 file-web/src/main/java/com/qiwenshare/file/api/IElasticSearchService.java create mode 100644 file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java delete mode 100644 file-web/src/main/java/com/qiwenshare/file/dto/RegisterDTO.java rename file-web/src/main/java/com/qiwenshare/file/dto/{ => file}/BatchDeleteFileDTO.java (86%) rename file-web/src/main/java/com/qiwenshare/file/dto/{ => file}/CreateFileDTO.java (88%) rename file-web/src/main/java/com/qiwenshare/file/dto/{ => file}/DeleteFileDTO.java (92%) rename file-web/src/main/java/com/qiwenshare/file/dto/{ => file}/RenameFileDTO.java (94%) create mode 100644 file-web/src/main/java/com/qiwenshare/file/dto/file/SearchFileDTO.java rename file-web/src/main/java/com/qiwenshare/file/dto/{ => file}/UnzipFileDTO.java (88%) diff --git a/file-common/pom.xml b/file-common/pom.xml index da8a36b..62f959d 100644 --- a/file-common/pom.xml +++ b/file-common/pom.xml @@ -50,6 +50,13 @@ 1.26.2 + + + org.springframework.boot + spring-boot-starter-data-redis + + + diff --git a/file-common/src/main/java/com/qiwenshare/common/config/RedisAutoConfiguration.java b/file-common/src/main/java/com/qiwenshare/common/config/RedisAutoConfiguration.java new file mode 100644 index 0000000..bbdc78d --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/config/RedisAutoConfiguration.java @@ -0,0 +1,37 @@ +package com.qiwenshare.common.config; + + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableCaching +public class RedisAutoConfiguration extends CachingConfigurerSupport { + + @Bean + public KeyGenerator keyGenerator() { + return (target, method, params) -> { + StringBuilder sb = new StringBuilder(); + sb.append(target.getClass().getName()); + sb.append(method.getName()); + for (Object obj : params) { + sb.append(obj.toString()); + } + return sb.toString(); + }; + } + +// @Bean +// public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { +// RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() +// .entryTtl(Duration.ofHours(1)); // 设置缓存有效期一小时 +// return RedisCacheManager +// .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) +// .cacheDefaults(redisCacheConfiguration).build(); +// } + +} + diff --git a/file-web/pom.xml b/file-web/pom.xml index 5bb6d14..e5a8eba 100644 --- a/file-web/pom.xml +++ b/file-web/pom.xml @@ -73,12 +73,10 @@ 4.13 test - - - - - - + + org.springframework.boot + spring-boot-starter-data-elasticsearch + diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IElasticSearchService.java b/file-web/src/main/java/com/qiwenshare/file/api/IElasticSearchService.java new file mode 100644 index 0000000..be6d57a --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/api/IElasticSearchService.java @@ -0,0 +1,8 @@ +package com.qiwenshare.file.api; + +import com.qiwenshare.file.config.es.FileSearch; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +public interface IElasticSearchService extends ElasticsearchRepository { + +} \ No newline at end of file diff --git a/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java b/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java new file mode 100644 index 0000000..3560ed1 --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java @@ -0,0 +1,49 @@ +package com.qiwenshare.file.config.es; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +@Data +@Document(indexName = "filesearch", shards = 1, replicas = 0) +public class FileSearch { + + @Id + private long fileSearchId; + @Field(type = FieldType.Long) + private Long fileId; + @Field(type = FieldType.Text, analyzer = "ik_max_word") + private String fileName; + @Field(type = FieldType.Keyword) + private String timeStampName; + @Field(type = FieldType.Keyword) + private String fileUrl; + @Field(type = FieldType.Long) + private Long fileSize; + @Field(type = FieldType.Integer) + private Integer isOSS; + @Field(type = FieldType.Integer) + private Integer pointCount; + @Field(type = FieldType.Keyword) + private String identifier; + @Field(type = FieldType.Long) + private Long userFileId; + @Field(type = FieldType.Long) + private Long userId; + @Field(type = FieldType.Keyword) + private String filePath; + @Field(type = FieldType.Keyword) + private String extendName; + @Field(type = FieldType.Integer) + private Integer isDir; + @Field(type = FieldType.Keyword) + private String uploadTime; + @Field(type = FieldType.Integer) + private Integer deleteFlag; + @Field(type = FieldType.Keyword) + private String deleteTime; + @Field(type = FieldType.Keyword) + private String deleteBatchNum; +} diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index e9b2397..9ce5644 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -1,6 +1,5 @@ package com.qiwenshare.file.controller; -import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -16,13 +15,23 @@ import com.qiwenshare.file.api.IRecoveryFileService; import com.qiwenshare.file.api.IUserFileService; import com.qiwenshare.file.api.IUserService; import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.file.config.es.FileSearch; import com.qiwenshare.file.domain.*; import com.qiwenshare.file.dto.*; +import com.qiwenshare.file.dto.file.*; import com.qiwenshare.file.vo.file.FileListVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; +import org.springframework.data.elasticsearch.core.SearchHits; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -54,7 +63,8 @@ public class FileController { public static final String CURRENT_MODULE = "文件接口"; - + @Autowired + private ElasticsearchRestTemplate elasticsearchRestTemplate; public static long treeid = 0; @@ -86,12 +96,48 @@ public class FileController { return RestResult.success(); } + @Operation(summary = "文件搜索", description = "文件搜索", tags = {"file"}) + @GetMapping(value = "/search") + @MyLog(operation = "文件搜索", module = CURRENT_MODULE) + @ResponseBody + public RestResult> searchFile(SearchFileDTO searchFileDTO) { + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); + HighlightBuilder.Field allHighLight = new HighlightBuilder.Field("*").preTags("") + .postTags(""); + + queryBuilder.withHighlightFields(allHighLight); + + //设置分页 + int currentPage = (int)searchFileDTO.getCurrentPage() - 1; + int pageCount = (int)(searchFileDTO.getPageCount() == 0 ? 10 : searchFileDTO.getPageCount()); + String order = searchFileDTO.getOrder(); + Sort.Direction direction = null; + if (searchFileDTO.getDirection() == null) { + direction = Sort.Direction.DESC; + } else if ("asc".equals(searchFileDTO.getDirection())) { + direction = Sort.Direction.ASC; + } else if ("desc".equals(searchFileDTO.getDirection())) { + direction = Sort.Direction.DESC; + } else { + direction = Sort.Direction.DESC; + } + if (order == null) { + queryBuilder.withPageable(PageRequest.of(currentPage, pageCount)); + } else { + queryBuilder.withPageable(PageRequest.of(currentPage, pageCount, Sort.by(direction, order))); + } + + queryBuilder.withQuery(QueryBuilders.matchQuery("fileName", searchFileDTO.getFileName())); + SearchHits search = elasticsearchRestTemplate.search(queryBuilder.build(), FileSearch.class); + + return RestResult.success().data(search); + } + @Operation(summary = "文件重命名", description = "文件重命名", tags = {"file"}) @RequestMapping(value = "/renamefile", method = RequestMethod.POST) @MyLog(operation = "文件重命名", module = CURRENT_MODULE) @ResponseBody public RestResult renameFile(@RequestBody RenameFileDTO renameFileDto, @RequestHeader("token") String token) { - RestResult restResult = new RestResult<>(); if (!operationCheck(token).getSuccess()){ return operationCheck(token); } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index 72838f3..ee122ae 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -2,6 +2,9 @@ package com.qiwenshare.file.controller; import com.aliyun.oss.OSS; import com.aliyun.oss.model.OSSObject; +import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; +import com.github.tobato.fastdfs.service.AppendFileStorageClient; +import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.cbb.DateUtil; import com.qiwenshare.common.operation.FileOperation; import com.qiwenshare.common.oss.AliyunOSSDownload; @@ -27,9 +30,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -53,6 +58,8 @@ public class FiletransferController { IUserService userService; @Resource IUserFileService userFileService; + @Autowired + private FastFileStorageClient fastFileStorageClient; public static final String CURRENT_MODULE = "文件传输接口"; @Operation(summary = "极速上传", description = "校验文件MD5判断文件是否存在,如果存在直接上传成功并返回skipUpload=true,如果不存在返回skipUpload=false需要再次调用该接口的POST方法", tags = {"filetransfer"}) @@ -147,19 +154,20 @@ public class FiletransferController { } response.setContentType("application/force-download");// 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 - byte[] buffer = new byte[1024]; + FileBean fileBean = fileService.getById(userFile.getFileId()); if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { - aliyunDownload(response, buffer, fileBean); + aliyunDownload(response, fileBean); } else { - localFileDownload(response, buffer, fileBean); + localFileDownload(response, fileBean); } } - private void localFileDownload(HttpServletResponse response, byte[] buffer, FileBean fileBean) { + private void localFileDownload(HttpServletResponse response, FileBean fileBean) { BufferedInputStream bis = null; + byte[] buffer = new byte[1024]; //设置文件路径 File file = FileOperation.newFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); if (file.exists()) { @@ -191,8 +199,9 @@ public class FiletransferController { } } - private void aliyunDownload(HttpServletResponse response, byte[] buffer, FileBean fileBean) { + private void aliyunDownload(HttpServletResponse response, FileBean fileBean) { BufferedInputStream bis = null; + byte[] buffer = new byte[1024]; AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); @@ -220,6 +229,33 @@ public class FiletransferController { ossClient.shutdown(); } + + public void fastFDSDownload(HttpServletResponse response, FileBean fileBean) throws IOException { + String group = fileBean.getFileUrl().substring(0, fileBean.getFileUrl().indexOf("/")); + String path = fileBean.getFileUrl().substring(fileBean.getFileUrl().indexOf("/") + 1); + DownloadByteArray downloadByteArray = new DownloadByteArray(); + byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray); + + // 这里只是为了整合fastdfs,所以写死了文件格式。需要在上传的时候保存文件名。下载的时候使用对应的格式 + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("sb.xlsx", "UTF-8")); + response.setCharacterEncoding("UTF-8"); + ServletOutputStream outputStream = null; + try { + outputStream = response.getOutputStream(); + outputStream.write(bytes); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"}) @RequestMapping(value = "/getstorage", method = RequestMethod.GET) @ResponseBody diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java index 20e40c5..8c520d3 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java @@ -1,13 +1,19 @@ package com.qiwenshare.file.controller; +import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qiwenshare.file.api.IElasticSearchService; +import com.qiwenshare.file.config.es.FileSearch; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.service.FileService; import com.qiwenshare.file.service.UserFileService; import com.qiwenshare.file.service.UserService; +import com.qiwenshare.file.vo.file.FileListVo; import lombok.extern.slf4j.Slf4j; +import org.apache.catalina.User; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; @@ -22,6 +28,10 @@ public class TaskController { @Resource FileService fileService; + @Resource + UserFileService userFileService; + @Autowired + private IElasticSearchService elasticSearchService; @Scheduled(cron = "0 0/1 * * * ?") public void deleteFile() { @@ -36,7 +46,28 @@ public class TaskController { fileService.deleteLocalFile(fileBean); fileService.removeById(fileBean.getFileId()); } -// fileService.remove(fileBeanLambdaQueryWrapper); } + + @Scheduled(fixedRate = 1000 * 60 * 60 * 24) + public void updateElasticSearch() { + + UserFile userFile = new UserFile(); + try { + elasticSearchService.deleteAll(); + } catch (Exception e) { + log.error("删除ES失败:" + e); + } + try { + List userfiles = userFileService.userFileList(userFile, 0L, 999999L); + for (FileListVo fileListVo : userfiles) { + log.info(JSON.toJSONString(fileListVo)); + FileSearch fileSearch = new FileSearch(); + BeanUtil.copyProperties(fileListVo, fileSearch); + elasticSearchService.save(fileSearch); + } + } catch (Exception e) { + log.error("更新ES失败:" + e); + } + } } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java index 85ad31c..028557a 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java @@ -9,7 +9,7 @@ import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IUserService; import com.qiwenshare.file.config.QiwenFileConfig; import com.qiwenshare.file.domain.UserBean; -import com.qiwenshare.file.dto.RegisterDTO; +import com.qiwenshare.file.dto.user.RegisterDTO; import com.qiwenshare.file.vo.user.UserLoginVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/RegisterDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/RegisterDTO.java deleted file mode 100644 index 8a22de3..0000000 --- a/file-web/src/main/java/com/qiwenshare/file/dto/RegisterDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.qiwenshare.file.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "用户注册DTO",required = true) -public class RegisterDTO { - @Schema(description = "用户名") - private String username; - @Schema(description = "手机号") - private String telephone; - @Schema(description = "密码") - private String password; -} diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/BatchDeleteFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/BatchDeleteFileDTO.java similarity index 86% rename from file-web/src/main/java/com/qiwenshare/file/dto/BatchDeleteFileDTO.java rename to file-web/src/main/java/com/qiwenshare/file/dto/file/BatchDeleteFileDTO.java index 4b6fa51..79fde76 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/BatchDeleteFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/BatchDeleteFileDTO.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.dto; +package com.qiwenshare.file.dto.file; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/CreateFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/CreateFileDTO.java similarity index 88% rename from file-web/src/main/java/com/qiwenshare/file/dto/CreateFileDTO.java rename to file-web/src/main/java/com/qiwenshare/file/dto/file/CreateFileDTO.java index 66fdc5a..f58128e 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/CreateFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/CreateFileDTO.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.dto; +package com.qiwenshare.file.dto.file; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/DeleteFileDTO.java similarity index 92% rename from file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java rename to file-web/src/main/java/com/qiwenshare/file/dto/file/DeleteFileDTO.java index 40f61cd..14d9d0d 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/DeleteFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/DeleteFileDTO.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.dto; +package com.qiwenshare.file.dto.file; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/RenameFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java similarity index 94% rename from file-web/src/main/java/com/qiwenshare/file/dto/RenameFileDTO.java rename to file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java index d54a257..a1b943e 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/RenameFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.dto; +package com.qiwenshare.file.dto.file; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/file/SearchFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/SearchFileDTO.java new file mode 100644 index 0000000..c403414 --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/SearchFileDTO.java @@ -0,0 +1,12 @@ +package com.qiwenshare.file.dto.file; + +import lombok.Data; + +@Data +public class SearchFileDTO { + private String fileName; + private long currentPage; + private long pageCount; + private String order; + private String direction; +} diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/UnzipFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/UnzipFileDTO.java similarity index 88% rename from file-web/src/main/java/com/qiwenshare/file/dto/UnzipFileDTO.java rename to file-web/src/main/java/com/qiwenshare/file/dto/file/UnzipFileDTO.java index 77062d8..8b05212 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/UnzipFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/UnzipFileDTO.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.dto; +package com.qiwenshare.file.dto.file; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/user/RegisterDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/user/RegisterDTO.java index f8fc045..7e72cf5 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/user/RegisterDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/user/RegisterDTO.java @@ -1,6 +1,15 @@ package com.qiwenshare.file.dto.user; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +@Data +@Schema(name = "用户注册DTO",required = true) public class RegisterDTO { - + @Schema(description = "用户名") + private String username; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "密码") + private String password; } diff --git a/file-web/src/main/resources/config/application.properties b/file-web/src/main/resources/config/application.properties index 6306424..9336bdf 100644 --- a/file-web/src/main/resources/config/application.properties +++ b/file-web/src/main/resources/config/application.properties @@ -71,3 +71,27 @@ fdfs.thumb-image.width=150 fdfs.thumb-image.height=150 fdfs.tracker-list=121.89.222.103:22122 + +# Redis数据库索引(默认为0) +spring.redis.database=0 +# Redis服务器地址 +spring.redis.host=123.56.9.174 +# Redis服务器连接端口 +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password=ma123456 +# 连接池最大连接数(使用负值表示没有限制) 默认 8 +spring.redis.lettuce.pool.max-active=8 +# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 +spring.redis.lettuce.pool.max-wait=10000 +# 连接池中的最大空闲连接 默认 8 +spring.redis.lettuce.pool.max-idle=30 +# 连接池中的最小空闲连接 默认 0 +spring.redis.lettuce.pool.min-idle=10 +#连接超时时间(毫秒) +spring.redis.timeout=5000 + + +spring.data.elasticsearch.client.reactive.endpoints=127.0.0.1:9200 +spring.elasticsearch.rest.uris=127.0.0.1:9200 + From 58373861e7bfa71ded54bbba28b78000dd897351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Mon, 22 Mar 2021 20:53:22 +0800 Subject: [PATCH 10/14] =?UTF-8?q?=E5=BA=95=E5=B1=82=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiwenshare/common/domain/UploadFile.java | 2 + .../common/download/Downloader.java | 10 + .../download/product/AliyunOSSDownloader.java | 12 + .../download/product/ChunkDownloader.java | 12 + .../download/product/FastDFSDownloader.java | 12 + .../qiwenshare/common/upload/Uploader.java | 4 +- .../factory/AliyunOSSUploaderFactory.java | 13 +- .../upload/factory/ChunkUploaderFactory.java | 12 +- .../factory/FastDFSUploaderFactory.java | 14 +- .../upload/factory/NormalUploaderFactory.java | 48 ++-- .../upload/factory/UploaderFactory.java | 2 +- .../upload/product/AliyunOSSUploader.java | 49 ++-- .../common/upload/product/ChunkUploader.java | 28 +- .../upload/product/FastDFSUploader.java | 41 +-- .../common/upload/product/NormalUploader.java | 271 +++++++++--------- .../com/qiwenshare/common/util/RedisUtil.java | 79 +++++ .../qiwenshare/file/config/es/FileSearch.java | 3 + .../file/controller/FileController.java | 19 +- .../controller/FiletransferController.java | 14 +- .../com/qiwenshare/file/domain/FileBean.java | 4 + .../file/dto/file/RenameFileDTO.java | 4 + .../qiwenshare/file/service/FileService.java | 14 + .../file/service/FiletransferService.java | 10 +- .../file/service/UserFileService.java | 92 +++--- .../qiwenshare/file/vo/file/FileListVo.java | 3 + .../file/vo/share/ShareFileListVO.java | 3 + 26 files changed, 477 insertions(+), 298 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/download/Downloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/util/RedisUtil.java diff --git a/file-common/src/main/java/com/qiwenshare/common/domain/UploadFile.java b/file-common/src/main/java/com/qiwenshare/common/domain/UploadFile.java index 47087b6..faba858 100644 --- a/file-common/src/main/java/com/qiwenshare/common/domain/UploadFile.java +++ b/file-common/src/main/java/com/qiwenshare/common/domain/UploadFile.java @@ -11,7 +11,9 @@ public class UploadFile { private int success; private String message; private String url; + @Deprecated private Integer isOSS; + private Integer storageType; //切片上传相关参数 private String taskId; private int chunkNumber; diff --git a/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java b/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java new file mode 100644 index 0000000..5b244a5 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java @@ -0,0 +1,10 @@ +package com.qiwenshare.common.download; + +import com.qiwenshare.common.domain.UploadFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public abstract class Downloader { + public abstract void download(HttpServletResponse httpServletResponse); +} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java new file mode 100644 index 0000000..d0b1c75 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java @@ -0,0 +1,12 @@ +package com.qiwenshare.common.download.product; + +import com.qiwenshare.common.download.Downloader; + +import javax.servlet.http.HttpServletResponse; + +public class AliyunOSSDownloader extends Downloader { + @Override + public void download(HttpServletResponse httpServletResponse) { + + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java new file mode 100644 index 0000000..ee454b2 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java @@ -0,0 +1,12 @@ +package com.qiwenshare.common.download.product; + +import com.qiwenshare.common.download.Downloader; + +import javax.servlet.http.HttpServletResponse; + +public class ChunkDownloader extends Downloader { + @Override + public void download(HttpServletResponse httpServletResponse) { + + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java new file mode 100644 index 0000000..d01f776 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java @@ -0,0 +1,12 @@ +package com.qiwenshare.common.download.product; + +import com.qiwenshare.common.download.Downloader; + +import javax.servlet.http.HttpServletResponse; + +public class FastDFSDownloader extends Downloader { + @Override + public void download(HttpServletResponse httpServletResponse) { + + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java index b9615a0..eafdd13 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java @@ -24,9 +24,9 @@ public abstract class Uploader { // 文件大小限制,单位KB public final int maxSize = 10000000; - protected StandardMultipartHttpServletRequest request = null; +// protected StandardMultipartHttpServletRequest request = null; - public abstract List upload(HttpServletRequest request); + public abstract List upload(HttpServletRequest request, UploadFile uploadFile); /** * 根据字符串创建本地目录 并按照日期建立子目录返回 diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java index 2661666..a238ac4 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java @@ -11,15 +11,16 @@ import javax.annotation.Resource; @Component public class AliyunOSSUploaderFactory implements UploaderFactory { - + @Resource + AliyunOSSUploader aliyunOSSUploader; @Override public Uploader getUploader() { - return new AliyunOSSUploader(); + return aliyunOSSUploader; } - @Override - public Uploader getUploader(UploadFile uploadFile) { - return new AliyunOSSUploader(uploadFile); - } +// @Override +// public Uploader getUploader(UploadFile uploadFile) { +// return new AliyunOSSUploader(uploadFile); +// } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java index 830104a..cdb3303 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java @@ -11,15 +11,17 @@ import javax.annotation.Resource; @Component public class ChunkUploaderFactory implements UploaderFactory { + @Resource + ChunkUploader ChunkUploader; @Override public Uploader getUploader() { - return new ChunkUploader(); + return ChunkUploader; } - @Override - public Uploader getUploader(UploadFile uploadFile) { - return new ChunkUploader(uploadFile); - } +// @Override +// public Uploader getUploader(UploadFile uploadFile) { +// return new ChunkUploader(uploadFile); +// } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java index 5e6a80f..c030695 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java @@ -11,16 +11,18 @@ import javax.annotation.Resource; @Component public class FastDFSUploaderFactory implements UploaderFactory { +// @Resource +// AppendFileStorageClient defaultAppendFileStorageClient; @Resource - AppendFileStorageClient defaultAppendFileStorageClient; + FastDFSUploader fastDFSUploader; @Override public Uploader getUploader() { - return new FastDFSUploader(); + return fastDFSUploader; } - @Override - public Uploader getUploader(UploadFile uploadFile) { - return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); - } +// @Override +// public Uploader getUploader(UploadFile uploadFile) { +// return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); +// } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java index 145dfa7..1bde493 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java @@ -1,24 +1,24 @@ -package com.qiwenshare.common.upload.factory; - -import com.github.tobato.fastdfs.service.AppendFileStorageClient; -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.upload.product.NormalUploader; -import com.qiwenshare.common.upload.Uploader; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -@Component -public class NormalUploaderFactory implements UploaderFactory { - - @Override - public Uploader getUploader() { - return new NormalUploader(); - } - - @Override - public Uploader getUploader(UploadFile uploadFile) { - return new NormalUploader(); - } - -} +//package com.qiwenshare.common.upload.factory; +// +//import com.github.tobato.fastdfs.service.AppendFileStorageClient; +//import com.qiwenshare.common.domain.UploadFile; +//import com.qiwenshare.common.upload.product.NormalUploader; +//import com.qiwenshare.common.upload.Uploader; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.Resource; +// +//@Component +//public class NormalUploaderFactory implements UploaderFactory { +// +// @Override +// public Uploader getUploader() { +// return new NormalUploader(); +// } +// +// @Override +// public Uploader getUploader(UploadFile uploadFile) { +// return new NormalUploader(); +// } +// +//} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java index 99a4793..df1272f 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java @@ -6,5 +6,5 @@ import com.qiwenshare.common.upload.Uploader; public interface UploaderFactory { Uploader getUploader(); - Uploader getUploader(UploadFile uploadFile); +// Uploader getUploader(UploadFile uploadFile); } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java index 0e996dd..d6e3188 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java @@ -16,6 +16,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; @@ -24,11 +25,11 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.*; - +@Component public class AliyunOSSUploader extends Uploader { private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUploader.class); - private UploadFile uploadFile; +// private UploadFile uploadFile; private String endpoint; private String accessKeyId; private String accessKeySecret; @@ -46,23 +47,23 @@ public class AliyunOSSUploader extends Uploader { } - public AliyunOSSUploader(UploadFile uploadFile) { - this.uploadFile = uploadFile; - } +// public AliyunOSSUploader(UploadFile uploadFile) { +// this.uploadFile = uploadFile; +// } @Override - public List upload(HttpServletRequest httpServletRequest) { + public List upload(HttpServletRequest httpServletRequest, UploadFile uploadFile) { logger.info("开始上传upload"); List saveUploadFileList = new ArrayList<>(); - this.request = (StandardMultipartHttpServletRequest) httpServletRequest; + StandardMultipartHttpServletRequest request = (StandardMultipartHttpServletRequest) httpServletRequest; AliyunOSS aliyunOSS = (AliyunOSS) request.getAttribute("oss"); endpoint = aliyunOSS.getEndpoint(); accessKeyId = aliyunOSS.getAccessKeyId(); accessKeySecret = aliyunOSS.getAccessKeySecret(); bucketName = aliyunOSS.getBucketName(); - boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); + boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); // UploadFile uploadFile = new UploadFile(); @@ -78,10 +79,10 @@ public class AliyunOSSUploader extends Uploader { ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 sfu.setSizeMax(this.maxSize * 1024L); sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 - Iterator iter = this.request.getFileNames(); + Iterator iter = request.getFileNames(); while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); + saveUploadFileList = doUpload(request, savePath, iter, uploadFile); } @@ -89,13 +90,13 @@ public class AliyunOSSUploader extends Uploader { return saveUploadFileList; } - private List doUpload(String savePath, Iterator iter) { - OSS ossClient = getClient(); + private List doUpload(StandardMultipartHttpServletRequest standardMultipartHttpServletRequest, String savePath, Iterator iter, UploadFile uploadFile) { + OSS ossClient = getClient(uploadFile); List saveUploadFileList = new ArrayList<>(); try { - MultipartFile multipartfile = this.request.getFile(iter.next()); + MultipartFile multipartfile = standardMultipartHttpServletRequest.getFile(iter.next()); String timeStampName = getTimeStampName(); String originalName = multipartfile.getOriginalFilename(); @@ -157,7 +158,7 @@ public class AliyunOSSUploader extends Uploader { boolean isComplete = checkUploadStatus(uploadFile, confFile); if (isComplete) { logger.info("分片上传完成"); - completeMultipartUpload(); + completeMultipartUpload(uploadFile); uploadFile.setUrl(ossFilePath); uploadFile.setSuccess(1); @@ -173,6 +174,7 @@ public class AliyunOSSUploader extends Uploader { } uploadFile.setIsOSS(1); + uploadFile.setStorageType(1); uploadFile.setFileSize(uploadFile.getTotalSize()); saveUploadFileList.add(uploadFile); @@ -182,7 +184,7 @@ public class AliyunOSSUploader extends Uploader { /** * 将文件分块进行升序排序并执行文件上传。 */ - protected void completeMultipartUpload() { + protected void completeMultipartUpload(UploadFile uploadFile) { List partETags = partETagsMap.get(uploadFile.getIdentifier()); Collections.sort(partETags, Comparator.comparingInt(PartETag::getPartNumber)); @@ -194,16 +196,16 @@ public class AliyunOSSUploader extends Uploader { partETags); logger.info("----:" + JSON.toJSONString(partETags)); // 完成上传。 - CompleteMultipartUploadResult completeMultipartUploadResult = getClient().completeMultipartUpload(completeMultipartUploadRequest); + CompleteMultipartUploadResult completeMultipartUploadResult = getClient(uploadFile).completeMultipartUpload(completeMultipartUploadRequest); logger.info("----:" + JSON.toJSONString(completeMultipartUploadRequest)); - getClient().shutdown(); + getClient(uploadFile).shutdown(); partETagsMap.remove(uploadFile.getIdentifier()); uploadPartRequestMap.remove(uploadFile.getIdentifier()); ossMap.remove(uploadFile.getIdentifier()); // } - private void listFile() { + private void listFile(UploadFile uploadFile) { // 列举已上传的分片,其中uploadId来自于InitiateMultipartUpload返回的结果。 ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); // 设置uploadId。 @@ -212,7 +214,7 @@ public class AliyunOSSUploader extends Uploader { listPartsRequest.setMaxParts(100); // 指定List的起始位置。只有分片号大于此参数值的分片会被列举。 // listPartsRequest.setPartNumberMarker(1); - PartListing partListing = getClient().listParts(listPartsRequest); + PartListing partListing = getClient(uploadFile).listParts(listPartsRequest); for (PartSummary part : partListing.getParts()) { logger.info("分片号:"+part.getPartNumber() + ", 分片数据大小: "+ @@ -233,15 +235,14 @@ public class AliyunOSSUploader extends Uploader { /** * 取消上传 */ - private void cancelUpload() { + private void cancelUpload(UploadFile uploadFile) { AbortMultipartUploadRequest abortMultipartUploadRequest = new AbortMultipartUploadRequest(bucketName, uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); - getClient().abortMultipartUpload(abortMultipartUploadRequest); + getClient(uploadFile).abortMultipartUpload(abortMultipartUploadRequest); } - @Override - protected synchronized String getTimeStampName(){ + protected synchronized String getTimeStampName(UploadFile uploadFile){ String timeStampName; if (StringUtils.isEmpty(timeStampNameMap.get(uploadFile.getIdentifier()))) { @@ -253,7 +254,7 @@ public class AliyunOSSUploader extends Uploader { return timeStampName; } - private synchronized OSS getClient() { + private synchronized OSS getClient(UploadFile uploadFile) { OSS ossClient = null; if (ossMap.get(uploadFile.getIdentifier()) == null) { ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java index d9e0afe..6acb4ba 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java @@ -13,6 +13,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; @@ -24,24 +25,24 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; - +@Component public class ChunkUploader extends Uploader { private static final Logger logger = LoggerFactory.getLogger(ChunkUploader.class); - private UploadFile uploadFile; +// private UploadFile uploadFile; public ChunkUploader() { } - - public ChunkUploader(UploadFile uploadFile) { - this.uploadFile = uploadFile; - } +// +// public ChunkUploader(UploadFile uploadFile) { +// this.uploadFile = uploadFile; +// } @Override - public List upload(HttpServletRequest httpServletRequest) { + public List upload(HttpServletRequest httpServletRequest,UploadFile uploadFile) { List saveUploadFileList = new ArrayList(); - this.request = (StandardMultipartHttpServletRequest) httpServletRequest; - boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); + StandardMultipartHttpServletRequest standardMultipartHttpServletRequest = (StandardMultipartHttpServletRequest) httpServletRequest; + boolean isMultipart = ServletFileUpload.isMultipartContent(standardMultipartHttpServletRequest); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); } @@ -53,9 +54,9 @@ public class ChunkUploader extends Uploader { ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 sfu.setSizeMax(this.maxSize * 1024L); sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 - Iterator iter = this.request.getFileNames(); + Iterator iter = standardMultipartHttpServletRequest.getFileNames(); while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); + saveUploadFileList = doUpload(standardMultipartHttpServletRequest, savePath, iter, uploadFile); } } catch (IOException e) { throw new UploadGeneralException("未包含文件上传域"); @@ -65,9 +66,9 @@ public class ChunkUploader extends Uploader { return saveUploadFileList; } - private List doUpload(String savePath, Iterator iter) throws IOException, NotSameFileExpection { + private List doUpload(StandardMultipartHttpServletRequest standardMultipartHttpServletRequest, String savePath, Iterator iter, UploadFile uploadFile) throws IOException, NotSameFileExpection { List saveUploadFileList = new ArrayList(); - MultipartFile multipartfile = this.request.getFile(iter.next()); + MultipartFile multipartfile = standardMultipartHttpServletRequest.getFile(iter.next()); String timeStampName = uploadFile.getIdentifier(); @@ -88,6 +89,7 @@ public class ChunkUploader extends Uploader { File minFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + minFilePath); File confFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + confFilePath); uploadFile.setIsOSS(0); + uploadFile.setStorageType(0); uploadFile.setUrl(saveFilePath); if (StringUtils.isEmpty(uploadFile.getTaskId())) {// == null || "".equals(uploadFile.getTaskId())) { diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java index ff6e5a8..f540628 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java @@ -10,19 +10,22 @@ import com.qiwenshare.common.util.PathUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.*; - +@Component @Slf4j public class FastDFSUploader extends Uploader { public static Object lock = new Object(); + @Resource AppendFileStorageClient defaultAppendFileStorageClient; - UploadFile uploadFile; +// UploadFile uploadFile; private static Map CURRENT_UPLOAD_CHUNK_NUMBER = new HashMap<>(); private static Map UPLOADED_SIZE = new HashMap<>(); @@ -33,20 +36,24 @@ public class FastDFSUploader extends Uploader { } - public FastDFSUploader(UploadFile uploadFile, AppendFileStorageClient defaultAppendFileStorageClient) { - this.uploadFile = uploadFile; - this.defaultAppendFileStorageClient = defaultAppendFileStorageClient; - } +// public FastDFSUploader(UploadFile uploadFile) { +// this.uploadFile = uploadFile; +// } +// +// public FastDFSUploader(UploadFile uploadFile, AppendFileStorageClient defaultAppendFileStorageClient) { +//// this.uploadFile = uploadFile; +// this.defaultAppendFileStorageClient = defaultAppendFileStorageClient; +// } @Override - public List upload(HttpServletRequest request) { + public List upload(HttpServletRequest request, UploadFile uploadFile) { log.info("开始上传upload"); List saveUploadFileList = new ArrayList<>(); - this.request = (StandardMultipartHttpServletRequest) request; + StandardMultipartHttpServletRequest standardMultipartHttpServletRequest = (StandardMultipartHttpServletRequest) request; - boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); + boolean isMultipart = ServletFileUpload.isMultipartContent(standardMultipartHttpServletRequest); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); } @@ -58,9 +65,9 @@ public class FastDFSUploader extends Uploader { ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 sfu.setSizeMax(this.maxSize * 1024L); sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 - Iterator iter = this.request.getFileNames(); + Iterator iter = standardMultipartHttpServletRequest.getFileNames(); while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); + saveUploadFileList = doUpload(standardMultipartHttpServletRequest, savePath, iter, uploadFile); } } catch (Exception e) { throw new UploadGeneralException(e); @@ -71,18 +78,18 @@ public class FastDFSUploader extends Uploader { } - private List doUpload(String savePath, Iterator iter) { + private List doUpload(StandardMultipartHttpServletRequest standardMultipartHttpServletRequest, String savePath, Iterator iter, UploadFile uploadFile) { List saveUploadFileList = new ArrayList<>(); try { - MultipartFile multipartfile = this.request.getFile(iter.next()); + MultipartFile multipartfile = standardMultipartHttpServletRequest.getFile(iter.next()); synchronized (lock) { if (LOCK_MAP.get(uploadFile.getIdentifier()) == null) { LOCK_MAP.put(uploadFile.getIdentifier(), new Object()); } } - uploadFileChunk(multipartfile); + uploadFileChunk(multipartfile, uploadFile); String timeStampName = getTimeStampName(); String originalName = multipartfile.getOriginalFilename(); @@ -115,14 +122,14 @@ public class FastDFSUploader extends Uploader { throw new UploadGeneralException(e); } - uploadFile.setIsOSS(1); - + uploadFile.setIsOSS(0); + uploadFile.setStorageType(2); uploadFile.setFileSize(uploadFile.getTotalSize()); saveUploadFileList.add(uploadFile); return saveUploadFileList; } - public void uploadFileChunk(MultipartFile multipartFile) { + public void uploadFileChunk(MultipartFile multipartFile, UploadFile uploadFile) { synchronized (LOCK_MAP.get(uploadFile.getIdentifier())) { // 存储在fastdfs不带组的路径 diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java index b882b0e..c89c2ad 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java @@ -1,135 +1,136 @@ -package com.qiwenshare.common.upload.product; - -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.operation.ImageOperation; -import com.qiwenshare.common.upload.Uploader; -import com.qiwenshare.common.util.FileUtil; -import com.qiwenshare.common.util.PathUtil; -import org.apache.commons.fileupload.disk.DiskFileItemFactory; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.apache.commons.fileupload.util.Streams; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; - -import javax.servlet.http.HttpServletRequest; -import java.io.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class NormalUploader extends Uploader { - private static final Logger logger = LoggerFactory.getLogger(NormalUploader.class); - - @Override - public List upload(HttpServletRequest httpServletRequest) { - List saveUploadFileList = new ArrayList(); - this.request = (StandardMultipartHttpServletRequest) httpServletRequest; - boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); - if (!isMultipart) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(0); - uploadFile.setMessage("未包含文件上传域"); - saveUploadFileList.add(uploadFile); - return saveUploadFileList; - } - DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 - String savePath = getSaveFilePath(); - dff.setRepository(new File(savePath)); - - try { - ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 - sfu.setSizeMax(this.maxSize * 1024L); - sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 - Iterator iter = this.request.getFileNames(); - while (iter.hasNext()) { - saveUploadFileList = doUpload(savePath, iter); - } - } catch (IOException e) { - UploadFile uploadFile = new UploadFile(); - uploadFile.setSuccess(1); - uploadFile.setMessage("未知错误"); - saveUploadFileList.add(uploadFile); - e.printStackTrace(); - } - - return saveUploadFileList; - } - - private List doUpload(String savePath, Iterator iter) throws IOException { - List saveUploadFileList = new ArrayList(); - UploadFile uploadFile = new UploadFile(); - MultipartFile multipartfile = this.request.getFile(iter.next()); - - InputStream inputStream = multipartfile.getInputStream(); - String timeStampName = getTimeStampName(); - - - String originalName = multipartfile.getOriginalFilename(); - - String fileName = getFileName(originalName); - - String fileType = FileUtil.getFileExtendName(originalName); - uploadFile.setFileName(fileName); - uploadFile.setFileType(fileType); - uploadFile.setTimeStampName(timeStampName); - - String saveFilePath = savePath + FILE_SEPARATOR + timeStampName; - String minFilePath = savePath + FILE_SEPARATOR + timeStampName; - if (StringUtils.isNotEmpty(fileType)) { - saveFilePath += "." + fileType; - minFilePath += "_min" + "." + fileType; - } - - File file = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + saveFilePath); - File minFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + minFilePath); - - uploadFile.setIsOSS(0); - uploadFile.setUrl(saveFilePath); - BufferedInputStream in = null; - FileOutputStream out = null; - BufferedOutputStream output = null; - - try { - in = new BufferedInputStream(inputStream); - out = new FileOutputStream(file); - output = new BufferedOutputStream(out); - Streams.copy(in, output, true); - if (FileUtil.isImageFile(uploadFile.getFileType())){ - ImageOperation.thumbnailsImage(file, minFile, 300); - } - - } catch (FileNotFoundException e) { - logger.error("文件没有发现" + e); - } catch (IOException e) { - logger.error("文件读取失败" + e); - } finally { - - closeStream(in, out, output); - } - - - - uploadFile.setSuccess(1); - uploadFile.setMessage("上传成功"); - uploadFile.setFileSize(request.getContentLengthLong()); - saveUploadFileList.add(uploadFile); - return saveUploadFileList; - } - - - private void closeStream(BufferedInputStream in, FileOutputStream out, - BufferedOutputStream output) throws IOException { - if (in != null) { - in.close(); - } - if (out != null) { - out.close(); - } - if (output != null) { - output.close(); - } - } -} +//package com.qiwenshare.common.upload.product; +// +//import com.qiwenshare.common.domain.UploadFile; +//import com.qiwenshare.common.operation.ImageOperation; +//import com.qiwenshare.common.upload.Uploader; +//import com.qiwenshare.common.util.FileUtil; +//import com.qiwenshare.common.util.PathUtil; +//import org.apache.commons.fileupload.disk.DiskFileItemFactory; +//import org.apache.commons.fileupload.servlet.ServletFileUpload; +//import org.apache.commons.fileupload.util.Streams; +//import org.apache.commons.lang3.StringUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.web.multipart.MultipartFile; +//import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; +// +//import javax.servlet.http.HttpServletRequest; +//import java.io.*; +//import java.util.ArrayList; +//import java.util.Iterator; +//import java.util.List; +// +//public class NormalUploader extends Uploader { +// private static final Logger logger = LoggerFactory.getLogger(NormalUploader.class); +// +// @Override +// public List upload(HttpServletRequest httpServletRequest) { +// List saveUploadFileList = new ArrayList(); +// this.request = (StandardMultipartHttpServletRequest) httpServletRequest; +// boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); +// if (!isMultipart) { +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(0); +// uploadFile.setMessage("未包含文件上传域"); +// saveUploadFileList.add(uploadFile); +// return saveUploadFileList; +// } +// DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 +// String savePath = getSaveFilePath(); +// dff.setRepository(new File(savePath)); +// +// try { +// ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 +// sfu.setSizeMax(this.maxSize * 1024L); +// sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 +// Iterator iter = this.request.getFileNames(); +// while (iter.hasNext()) { +// saveUploadFileList = doUpload(savePath, iter); +// } +// } catch (IOException e) { +// UploadFile uploadFile = new UploadFile(); +// uploadFile.setSuccess(1); +// uploadFile.setMessage("未知错误"); +// saveUploadFileList.add(uploadFile); +// e.printStackTrace(); +// } +// +// return saveUploadFileList; +// } +// +// private List doUpload(String savePath, Iterator iter) throws IOException { +// List saveUploadFileList = new ArrayList(); +// UploadFile uploadFile = new UploadFile(); +// MultipartFile multipartfile = this.request.getFile(iter.next()); +// +// InputStream inputStream = multipartfile.getInputStream(); +// String timeStampName = getTimeStampName(); +// +// +// String originalName = multipartfile.getOriginalFilename(); +// +// String fileName = getFileName(originalName); +// +// String fileType = FileUtil.getFileExtendName(originalName); +// uploadFile.setFileName(fileName); +// uploadFile.setFileType(fileType); +// uploadFile.setTimeStampName(timeStampName); +// +// String saveFilePath = savePath + FILE_SEPARATOR + timeStampName; +// String minFilePath = savePath + FILE_SEPARATOR + timeStampName; +// if (StringUtils.isNotEmpty(fileType)) { +// saveFilePath += "." + fileType; +// minFilePath += "_min" + "." + fileType; +// } +// +// File file = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + saveFilePath); +// File minFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + minFilePath); +// +// uploadFile.setIsOSS(0); +// uploadFile.setStorageType(0); +// uploadFile.setUrl(saveFilePath); +// BufferedInputStream in = null; +// FileOutputStream out = null; +// BufferedOutputStream output = null; +// +// try { +// in = new BufferedInputStream(inputStream); +// out = new FileOutputStream(file); +// output = new BufferedOutputStream(out); +// Streams.copy(in, output, true); +// if (FileUtil.isImageFile(uploadFile.getFileType())){ +// ImageOperation.thumbnailsImage(file, minFile, 300); +// } +// +// } catch (FileNotFoundException e) { +// logger.error("文件没有发现" + e); +// } catch (IOException e) { +// logger.error("文件读取失败" + e); +// } finally { +// +// closeStream(in, out, output); +// } +// +// +// +// uploadFile.setSuccess(1); +// uploadFile.setMessage("上传成功"); +// uploadFile.setFileSize(request.getContentLengthLong()); +// saveUploadFileList.add(uploadFile); +// return saveUploadFileList; +// } +// +// +// private void closeStream(BufferedInputStream in, FileOutputStream out, +// BufferedOutputStream output) throws IOException { +// if (in != null) { +// in.close(); +// } +// if (out != null) { +// out.close(); +// } +// if (output != null) { +// output.close(); +// } +// } +//} diff --git a/file-common/src/main/java/com/qiwenshare/common/util/RedisUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/RedisUtil.java new file mode 100644 index 0000000..a6062d4 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/util/RedisUtil.java @@ -0,0 +1,79 @@ +package com.qiwenshare.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.SessionCallback; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class RedisUtil { + + @Resource + RedisTemplate redisTemplate; + + /** + * 将值放入缓存 + */ + public void set(String key, Object value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 字符串:取对象 + */ + public T getObject(String key) { + Object o = redisTemplate.opsForValue().get(key); + if (o != null) { + return (T) o; + } + return null; + } + + /** + * 将值放入缓存并设置时间-秒 + */ + public void set(String key, Object value, long time) { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + redisTemplate.opsForValue().set(key, value); + } + } + + /** + * 删除key + */ + public void deleteKey(String key) { + redisTemplate.delete(key); + } + + /** + * 创建锁 + * @param key 锁的Key + * @param value 值(随便写毫无意义) + * @param releaseTime 锁过期时间 防止死锁 + * @return boolean + */ + public boolean lock(String key, int value, long releaseTime) { + // 尝试获取锁 + Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS); + // 判断结果 + return boo != null && boo; + } + + + /** + * 根据key删除锁 + */ + public void deleteLock(String key) { + // 删除key即可释放锁 + deleteKey(key); + } +} \ No newline at end of file diff --git a/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java b/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java index 3560ed1..a2eb8c7 100644 --- a/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java +++ b/file-web/src/main/java/com/qiwenshare/file/config/es/FileSearch.java @@ -23,8 +23,11 @@ public class FileSearch { @Field(type = FieldType.Long) private Long fileSize; @Field(type = FieldType.Integer) + @Deprecated private Integer isOSS; @Field(type = FieldType.Integer) + private Integer storageType; + @Field(type = FieldType.Integer) private Integer pointCount; @Field(type = FieldType.Keyword) private String identifier; diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index 9ce5644..096ae22 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -142,27 +142,29 @@ public class FileController { return operationCheck(token); } UserBean sessionUserBean = userService.getUserBeanByToken(token); + UserFile userFile = userFileService.getById(renameFileDto.getUserFileId()); List userFiles = userFileService.selectUserFileByNameAndPath(renameFileDto.getFileName(), renameFileDto.getFilePath(), sessionUserBean.getUserId()); if (userFiles != null && !userFiles.isEmpty()) { return RestResult.fail().message("同名文件已存在"); } - if (1 == renameFileDto.getIsDir()) { + if (1 == userFile.getIsDir()) { LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); lambdaUpdateWrapper.set(UserFile::getFileName, renameFileDto.getFileName()) .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) .eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); userFileService.update(lambdaUpdateWrapper); - userFileService.replaceUserFilePath(renameFileDto.getFilePath() + renameFileDto.getFileName() + "/", - renameFileDto.getFilePath() + renameFileDto.getOldFileName() + "/", sessionUserBean.getUserId()); + userFileService.replaceUserFilePath(userFile.getFilePath() + renameFileDto.getFileName() + "/", + userFile.getFilePath() + userFile.getFileName() + "/", sessionUserBean.getUserId()); } else { - if (renameFileDto.getIsOSS() == 1) { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); - UserFile userFile = userFileService.getOne(lambdaQueryWrapper); + FileBean file = fileService.getById(userFile.getFileId()); + if (file.getIsOSS() == 1 || file.getStorageType() == 1) { +// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +// lambdaQueryWrapper.eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); +// UserFile userFile = userFileService.getOne(lambdaQueryWrapper); + - FileBean file = fileService.getById(userFile.getFileId()); String fileUrl = file.getFileUrl(); String newFileUrl = fileUrl.replace(userFile.getFileName(), renameFileDto.getFileName()); @@ -189,7 +191,6 @@ public class FileController { userFileService.update(lambdaUpdateWrapper); } - } return RestResult.success(); diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index ee122ae..3c12a1d 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -159,8 +159,12 @@ public class FiletransferController { FileBean fileBean = fileService.getById(userFile.getFileId()); if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { aliyunDownload(response, fileBean); - } else { + } else if (fileBean.getStorageType() == 0) { localFileDownload(response, fileBean); + } else if (fileBean.getStorageType() == 1) { + aliyunDownload(response, fileBean); + } else if (fileBean.getStorageType() == 2) { + fastFDSDownload(response, fileBean); } } @@ -230,15 +234,15 @@ public class FiletransferController { } - public void fastFDSDownload(HttpServletResponse response, FileBean fileBean) throws IOException { + public void fastFDSDownload(HttpServletResponse response, FileBean fileBean){ String group = fileBean.getFileUrl().substring(0, fileBean.getFileUrl().indexOf("/")); String path = fileBean.getFileUrl().substring(fileBean.getFileUrl().indexOf("/") + 1); DownloadByteArray downloadByteArray = new DownloadByteArray(); byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray); - // 这里只是为了整合fastdfs,所以写死了文件格式。需要在上传的时候保存文件名。下载的时候使用对应的格式 - response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("sb.xlsx", "UTF-8")); - response.setCharacterEncoding("UTF-8"); +// // 这里只是为了整合fastdfs,所以写死了文件格式。需要在上传的时候保存文件名。下载的时候使用对应的格式 +// response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("sb.xlsx", "UTF-8")); +// response.setCharacterEncoding("UTF-8"); ServletOutputStream outputStream = null; try { outputStream = response.getOutputStream(); diff --git a/file-web/src/main/java/com/qiwenshare/file/domain/FileBean.java b/file-web/src/main/java/com/qiwenshare/file/domain/FileBean.java index 0c5b0ee..d4bb8a2 100644 --- a/file-web/src/main/java/com/qiwenshare/file/domain/FileBean.java +++ b/file-web/src/main/java/com/qiwenshare/file/domain/FileBean.java @@ -34,8 +34,12 @@ public class FileBean { private Long fileSize; @Column(columnDefinition="int(1)") + @Deprecated private Integer isOSS; + @Column(columnDefinition="int(1)") + private Integer storageType; + @Column(columnDefinition="int(11)") private Integer pointCount; diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java index a1b943e..f005565 100644 --- a/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/RenameFileDTO.java @@ -11,6 +11,7 @@ public class RenameFileDTO { * 文件路径 */ @Schema(description = "文件路径") + @Deprecated private String filePath; /** @@ -19,9 +20,12 @@ public class RenameFileDTO { @Schema(description = "文件名") private String fileName; @Schema(description = "是否是目录") + @Deprecated private Integer isDir; @Schema(description = "旧文件名") + @Deprecated private String oldFileName; @Schema(description = "是否是OSS") + @Deprecated private Integer isOSS; } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java index 1da0e6a..466b06d 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java @@ -2,6 +2,7 @@ package com.qiwenshare.file.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.operation.FileOperation; import com.qiwenshare.common.oss.AliyunOSSDelete; import com.qiwenshare.common.util.FileUtil; @@ -12,6 +13,7 @@ import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.mapper.UserFileMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -28,6 +30,8 @@ public class FileService extends ServiceImpl implements IF FiletransferService filetransferService; @Resource QiwenFileConfig qiwenFileConfig; + @Autowired + private FastFileStorageClient fastFileStorageClient; // @Override // public void batchInsertFile(List fileBeanList, Long userId) { @@ -85,6 +89,16 @@ public class FileService extends ServiceImpl implements IF if (fileBean.getFileUrl() != null && fileBean.getFileUrl().indexOf("upload") != -1){ if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); + } else if (fileBean.getStorageType() == 0) { + FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); + if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { + FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); + } + } else if (fileBean.getStorageType() == 1) { + AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); + } else if (fileBean.getStorageType() == 2){ + fastFileStorageClient.deleteFile(fileBean.getFileUrl()); + } else { FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index aa8aead..5820e02 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -67,15 +67,15 @@ public class FiletransferService implements IFiletransferService { uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); synchronized (FiletransferService.class) { if (oss.isEnabled()) { - uploader = aliyunOSSUploaderFactory.getUploader(uploadFile); + uploader = aliyunOSSUploaderFactory.getUploader(); } else if ("FastFDS".equals(storyType)) { - uploader = fastDFSUploaderFactory.getUploader(uploadFile); + uploader = fastDFSUploaderFactory.getUploader(); } else { - uploader = chunkUploaderFactory.getUploader(uploadFile); + uploader = chunkUploaderFactory.getUploader(); } } - List uploadFileList = uploader.upload(request); + List uploadFileList = uploader.upload(request, uploadFile); for (int i = 0; i < uploadFileList.size(); i++){ uploadFile = uploadFileList.get(i); FileBean fileBean = new FileBean(); @@ -86,7 +86,7 @@ public class FiletransferService implements IFiletransferService { fileBean.setFileSize(uploadFile.getFileSize()); //fileBean.setUploadTime(DateUtil.getCurrentTime()); fileBean.setIsOSS(uploadFile.getIsOSS()); - + fileBean.setStorageType(uploadFile.getStorageType()); fileBean.setPointCount(1); fileMapper.insert(fileBean); UserFile userFile = new UserFile(); diff --git a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java index c716042..8b90829 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java @@ -62,53 +62,53 @@ public class UserFileService extends ServiceImpl impl return userFileMapper.userFileList(userFile, beginCount, pageCount); } - public void renameUserFile(Long userFileId, String newFileName, Long userId) { - UserFile userFile = userFileMapper.selectById(userFileId); - if (1 == userFile.getIsDir()) { - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) - .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) - .eq(UserFile::getUserFileId, userFile.getUserFileId()); - userFileMapper.update(null, lambdaUpdateWrapper); - replaceUserFilePath(userFile.getFilePath() + newFileName + "/", - userFile.getFilePath() + userFile.getFileName() + "/", userId); - } else { - FileBean fileBean = fileMapper.selectById(userFile.getFileId()); - if (fileBean.getIsOSS() == 1) { -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper.eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); -// UserFile userFile = userFileService.getOne(lambdaQueryWrapper); +// public void renameUserFile(Long userFileId, String newFileName, Long userId) { +// UserFile userFile = userFileMapper.selectById(userFileId); +// if (1 == userFile.getIsDir()) { +// LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); +// lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) +// .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) +// .eq(UserFile::getUserFileId, userFile.getUserFileId()); +// userFileMapper.update(null, lambdaUpdateWrapper); +// replaceUserFilePath(userFile.getFilePath() + newFileName + "/", +// userFile.getFilePath() + userFile.getFileName() + "/", userId); +// } else { +// FileBean fileBean = fileMapper.selectById(userFile.getFileId()); +// if (fileBean.getIsOSS() == 1) { +//// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); +//// lambdaQueryWrapper.eq(UserFile::getUserFileId, renameFileDto.getUserFileId()); +//// UserFile userFile = userFileService.getOne(lambdaQueryWrapper); +//// +//// FileBean file = fileService.getById(userFile.getFileId()); +// String fileUrl = fileBean.getFileUrl(); +// String newFileUrl = fileUrl.replace(userFile.getFileName(), newFileName); // -// FileBean file = fileService.getById(userFile.getFileId()); - String fileUrl = fileBean.getFileUrl(); - String newFileUrl = fileUrl.replace(userFile.getFileName(), newFileName); - - AliyunOSSRename.rename(qiwenFileConfig.getAliyun().getOss(), - fileUrl.substring(1), - newFileUrl.substring(1)); - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - lambdaUpdateWrapper - .set(FileBean::getFileUrl, newFileUrl) - .eq(FileBean::getFileId, fileBean.getFileId()); - fileMapper.update(null, lambdaUpdateWrapper); - - LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - userFileLambdaUpdateWrapper - .set(UserFile::getFileName, newFileName) - .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) - .eq(UserFile::getUserFileId, userFileId); - userFileMapper.update(null, userFileLambdaUpdateWrapper); - } else { - LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); - lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) - .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) - .eq(UserFile::getUserFileId, userFileId); - userFileMapper.update(null, lambdaUpdateWrapper); - } - - - } - } +// AliyunOSSRename.rename(qiwenFileConfig.getAliyun().getOss(), +// fileUrl.substring(1), +// newFileUrl.substring(1)); +// LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); +// lambdaUpdateWrapper +// .set(FileBean::getFileUrl, newFileUrl) +// .eq(FileBean::getFileId, fileBean.getFileId()); +// fileMapper.update(null, lambdaUpdateWrapper); +// +// LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); +// userFileLambdaUpdateWrapper +// .set(UserFile::getFileName, newFileName) +// .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) +// .eq(UserFile::getUserFileId, userFileId); +// userFileMapper.update(null, userFileLambdaUpdateWrapper); +// } else { +// LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); +// lambdaUpdateWrapper.set(UserFile::getFileName, newFileName) +// .set(UserFile::getUploadTime, DateUtil.getCurrentTime()) +// .eq(UserFile::getUserFileId, userFileId); +// userFileMapper.update(null, lambdaUpdateWrapper); +// } +// +// +// } +// } @Override public void updateFilepathByFilepath(String oldfilePath, String newfilePath, String fileName, String extendName) { diff --git a/file-web/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java b/file-web/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java index df3ddb1..ecc32b1 100644 --- a/file-web/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java +++ b/file-web/src/main/java/com/qiwenshare/file/vo/file/FileListVo.java @@ -12,8 +12,11 @@ public class FileListVo { private Long fileSize; + @Deprecated private Integer isOSS; + private Integer storageType; + private Integer pointCount; private String identifier; diff --git a/file-web/src/main/java/com/qiwenshare/file/vo/share/ShareFileListVO.java b/file-web/src/main/java/com/qiwenshare/file/vo/share/ShareFileListVO.java index b7133aa..404dfcd 100644 --- a/file-web/src/main/java/com/qiwenshare/file/vo/share/ShareFileListVO.java +++ b/file-web/src/main/java/com/qiwenshare/file/vo/share/ShareFileListVO.java @@ -15,7 +15,10 @@ public class ShareFileListVO { @Schema(description="文件大小") private Long fileSize; @Schema(description="是否sso存储") + @Deprecated private Integer isOSS; + @Schema(description="存储类型") + private Integer storageType; // // private Long userFileId; // From 9d12434de49bf3b4bbfe62b77df539472d305a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Mon, 22 Mar 2021 23:18:29 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common}/config/AliyunConfig.java | 2 +- .../qiwenshare/common}/config/FdfsConfig.java | 2 +- .../common}/config/QiwenFileConfig.java | 3 +- .../common/domain/DownloadFile.java | 9 +++ .../common/download/Downloader.java | 3 +- .../download/product/AliyunOSSDownloader.java | 44 ++++++++++- .../download/product/ChunkDownloader.java | 12 --- .../download/product/FastDFSDownloader.java | 34 ++++++++- .../product/LocalStorageDownloader.java | 50 ++++++++++++ .../factory/AliyunOSSOperationFactory.java | 27 +++++++ .../FastDFSOperationFactory.java} | 15 +++- .../common/factory/FileOperationFactory.java | 10 +++ .../factory/LocalStorageOperationFactory.java | 29 +++++++ .../factory/NormalUploaderFactory.java | 2 +- .../factory/AliyunOSSUploaderFactory.java | 26 ------- .../upload/factory/ChunkUploaderFactory.java | 27 ------- .../upload/factory/UploaderFactory.java | 10 --- .../upload/product/AliyunOSSUploader.java | 37 ++++----- ...ploader.java => LocalStorageUploader.java} | 6 +- .../file/api/IFiletransferService.java | 4 + .../file/controller/FileController.java | 2 +- .../controller/FiletransferController.java | 28 +------ .../file/controller/UserController.java | 2 +- .../qiwenshare/file/service/FileService.java | 2 +- .../file/service/FiletransferService.java | 76 +++++++++++++------ .../file/service/UserFileService.java | 5 +- .../resources/config/application.properties | 6 +- .../mybatis/mapper/UserFileMapper.xml | 41 +++++----- 28 files changed, 324 insertions(+), 190 deletions(-) rename {file-web/src/main/java/com/qiwenshare/file => file-common/src/main/java/com/qiwenshare/common}/config/AliyunConfig.java (80%) rename {file-web/src/main/java/com/qiwenshare/file => file-common/src/main/java/com/qiwenshare/common}/config/FdfsConfig.java (91%) rename {file-web/src/main/java/com/qiwenshare/file => file-common/src/main/java/com/qiwenshare/common}/config/QiwenFileConfig.java (75%) create mode 100644 file-common/src/main/java/com/qiwenshare/common/domain/DownloadFile.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java rename file-common/src/main/java/com/qiwenshare/common/{upload/factory/FastDFSUploaderFactory.java => factory/FastDFSOperationFactory.java} (61%) create mode 100644 file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java rename file-common/src/main/java/com/qiwenshare/common/{upload => }/factory/NormalUploaderFactory.java (93%) delete mode 100644 file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java rename file-common/src/main/java/com/qiwenshare/common/upload/product/{ChunkUploader.java => LocalStorageUploader.java} (98%) diff --git a/file-web/src/main/java/com/qiwenshare/file/config/AliyunConfig.java b/file-common/src/main/java/com/qiwenshare/common/config/AliyunConfig.java similarity index 80% rename from file-web/src/main/java/com/qiwenshare/file/config/AliyunConfig.java rename to file-common/src/main/java/com/qiwenshare/common/config/AliyunConfig.java index 5f455e9..cbf36dd 100644 --- a/file-web/src/main/java/com/qiwenshare/file/config/AliyunConfig.java +++ b/file-common/src/main/java/com/qiwenshare/common/config/AliyunConfig.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.config; +package com.qiwenshare.common.config; import com.qiwenshare.common.domain.AliyunOSS; import lombok.Data; diff --git a/file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java b/file-common/src/main/java/com/qiwenshare/common/config/FdfsConfig.java similarity index 91% rename from file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java rename to file-common/src/main/java/com/qiwenshare/common/config/FdfsConfig.java index 754eb5f..0ab7f62 100644 --- a/file-web/src/main/java/com/qiwenshare/file/config/FdfsConfig.java +++ b/file-common/src/main/java/com/qiwenshare/common/config/FdfsConfig.java @@ -1,4 +1,4 @@ -package com.qiwenshare.file.config; +package com.qiwenshare.common.config; import com.github.tobato.fastdfs.FdfsClientConfig; import org.springframework.context.annotation.Configuration; diff --git a/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java b/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java similarity index 75% rename from file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java rename to file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java index f135471..33a7958 100644 --- a/file-web/src/main/java/com/qiwenshare/file/config/QiwenFileConfig.java +++ b/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java @@ -1,8 +1,7 @@ -package com.qiwenshare.file.config; +package com.qiwenshare.common.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.stereotype.Component; @Data diff --git a/file-common/src/main/java/com/qiwenshare/common/domain/DownloadFile.java b/file-common/src/main/java/com/qiwenshare/common/domain/DownloadFile.java new file mode 100644 index 0000000..b66cba6 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/domain/DownloadFile.java @@ -0,0 +1,9 @@ +package com.qiwenshare.common.domain; + +import lombok.Data; + +@Data +public class DownloadFile { + private String fileUrl; + private String timeStampName; +} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java b/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java index 5b244a5..508c04e 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java @@ -1,10 +1,11 @@ package com.qiwenshare.common.download; +import com.qiwenshare.common.domain.DownloadFile; import com.qiwenshare.common.domain.UploadFile; import javax.servlet.http.HttpServletResponse; import java.util.List; public abstract class Downloader { - public abstract void download(HttpServletResponse httpServletResponse); + public abstract void download(HttpServletResponse httpServletResponse, DownloadFile uploadFile); } diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java index d0b1c75..5685be2 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java @@ -1,12 +1,54 @@ package com.qiwenshare.common.download.product; +import com.aliyun.oss.OSS; +import com.aliyun.oss.model.OSSObject; +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import com.qiwenshare.common.config.QiwenFileConfig; +import com.qiwenshare.common.domain.DownloadFile; import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.oss.AliyunOSSDownload; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +@Component public class AliyunOSSDownloader extends Downloader { + @Resource + QiwenFileConfig qiwenFileConfig; @Override - public void download(HttpServletResponse httpServletResponse) { + public void download(HttpServletResponse httpServletResponse, DownloadFile downloadFile) { + BufferedInputStream bis = null; + byte[] buffer = new byte[1024]; + AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); + OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); + OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), downloadFile.getTimeStampName()); + InputStream inputStream = ossObject.getObjectContent(); + try { + bis = new BufferedInputStream(inputStream); + OutputStream os = httpServletResponse.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + ossClient.shutdown(); } } diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java deleted file mode 100644 index ee454b2..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/ChunkDownloader.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.qiwenshare.common.download.product; - -import com.qiwenshare.common.download.Downloader; - -import javax.servlet.http.HttpServletResponse; - -public class ChunkDownloader extends Downloader { - @Override - public void download(HttpServletResponse httpServletResponse) { - - } -} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java index d01f776..5371474 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java @@ -1,12 +1,44 @@ package com.qiwenshare.common.download.product; +import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import com.qiwenshare.common.domain.DownloadFile; +import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.download.Downloader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +@Component public class FastDFSDownloader extends Downloader { + @Autowired + private FastFileStorageClient fastFileStorageClient; @Override - public void download(HttpServletResponse httpServletResponse) { + public void download(HttpServletResponse httpServletResponse, DownloadFile downloadFile) { + String group = downloadFile.getFileUrl().substring(0, downloadFile.getFileUrl().indexOf("/")); + String path = downloadFile.getFileUrl().substring(downloadFile.getFileUrl().indexOf("/") + 1); + DownloadByteArray downloadByteArray = new DownloadByteArray(); + byte[] bytes = fastFileStorageClient.downloadFile(group, path, downloadByteArray); +// // 这里只是为了整合fastdfs,所以写死了文件格式。需要在上传的时候保存文件名。下载的时候使用对应的格式 +// response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("sb.xlsx", "UTF-8")); +// response.setCharacterEncoding("UTF-8"); + ServletOutputStream outputStream = null; + try { + outputStream = httpServletResponse.getOutputStream(); + outputStream.write(bytes); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.flush(); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java b/file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java new file mode 100644 index 0000000..7c86ee9 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java @@ -0,0 +1,50 @@ +package com.qiwenshare.common.download.product; + +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import com.qiwenshare.common.domain.DownloadFile; +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.operation.FileOperation; +import com.qiwenshare.common.util.PathUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; + +@Component +public class LocalStorageDownloader extends Downloader { + @Override + public void download(HttpServletResponse httpServletResponse, DownloadFile downloadFile) { + BufferedInputStream bis = null; + byte[] buffer = new byte[1024]; + //设置文件路径 + File file = FileOperation.newFile(PathUtil.getStaticPath() + downloadFile.getFileUrl()); + if (file.exists()) { + + + FileInputStream fis = null; + + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + OutputStream os = httpServletResponse.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java new file mode 100644 index 0000000..f14f9f4 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java @@ -0,0 +1,27 @@ +package com.qiwenshare.common.factory; + +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.download.product.AliyunOSSDownloader; +import com.qiwenshare.common.upload.product.AliyunOSSUploader; +import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class AliyunOSSOperationFactory implements FileOperationFactory { + @Resource + AliyunOSSUploader aliyunOSSUploader; + @Resource + AliyunOSSDownloader aliyunOSSDownloader; + @Override + public Uploader getUploader() { + return aliyunOSSUploader; + } + + @Override + public Downloader getDownloader() { + return aliyunOSSDownloader; + } + +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java similarity index 61% rename from file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java rename to file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java index c030695..e998851 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java @@ -1,7 +1,7 @@ -package com.qiwenshare.common.upload.factory; +package com.qiwenshare.common.factory; -import com.github.tobato.fastdfs.service.AppendFileStorageClient; -import com.qiwenshare.common.domain.UploadFile; +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.download.product.FastDFSDownloader; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.product.FastDFSUploader; import org.springframework.stereotype.Component; @@ -9,17 +9,24 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component -public class FastDFSUploaderFactory implements UploaderFactory { +public class FastDFSOperationFactory implements FileOperationFactory { // @Resource // AppendFileStorageClient defaultAppendFileStorageClient; @Resource FastDFSUploader fastDFSUploader; + @Resource + FastDFSDownloader fastDFSDownloader; @Override public Uploader getUploader() { return fastDFSUploader; } + @Override + public Downloader getDownloader() { + return fastDFSDownloader; + } + // @Override // public Uploader getUploader(UploadFile uploadFile) { // return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java new file mode 100644 index 0000000..4db416d --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java @@ -0,0 +1,10 @@ +package com.qiwenshare.common.factory; + +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.upload.Uploader; + +public interface FileOperationFactory { + Uploader getUploader(); + Downloader getDownloader(); +// Uploader getUploader(UploadFile uploadFile); +} diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java new file mode 100644 index 0000000..67e445d --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java @@ -0,0 +1,29 @@ +package com.qiwenshare.common.factory; + +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.download.product.LocalStorageDownloader; +import com.qiwenshare.common.upload.product.LocalStorageUploader; +import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class LocalStorageOperationFactory implements FileOperationFactory{ + + @Resource + LocalStorageUploader ChunkUploader; + @Resource + LocalStorageDownloader localStorageDownloader; + @Override + public Uploader getUploader() { + return ChunkUploader; + } + + @Override + public Downloader getDownloader() { + return localStorageDownloader; + } + + +} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java similarity index 93% rename from file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java rename to file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java index 1bde493..40d5466 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java @@ -1,4 +1,4 @@ -//package com.qiwenshare.common.upload.factory; +//package com.qiwenshare.common.factory; // //import com.github.tobato.fastdfs.service.AppendFileStorageClient; //import com.qiwenshare.common.domain.UploadFile; diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java deleted file mode 100644 index a238ac4..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.qiwenshare.common.upload.factory; - -import com.github.tobato.fastdfs.service.AppendFileStorageClient; -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.upload.product.AliyunOSSUploader; -import com.qiwenshare.common.upload.Uploader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -@Component -public class AliyunOSSUploaderFactory implements UploaderFactory { - @Resource - AliyunOSSUploader aliyunOSSUploader; - @Override - public Uploader getUploader() { - return aliyunOSSUploader; - } - -// @Override -// public Uploader getUploader(UploadFile uploadFile) { -// return new AliyunOSSUploader(uploadFile); -// } - -} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java deleted file mode 100644 index cdb3303..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.qiwenshare.common.upload.factory; - -import com.github.tobato.fastdfs.service.AppendFileStorageClient; -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.upload.product.ChunkUploader; -import com.qiwenshare.common.upload.Uploader; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -@Component -public class ChunkUploaderFactory implements UploaderFactory { - - @Resource - ChunkUploader ChunkUploader; - @Override - public Uploader getUploader() { - return ChunkUploader; - } - -// @Override -// public Uploader getUploader(UploadFile uploadFile) { -// return new ChunkUploader(uploadFile); -// } - - -} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java deleted file mode 100644 index df1272f..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.qiwenshare.common.upload.factory; - -import com.github.tobato.fastdfs.service.AppendFileStorageClient; -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.upload.Uploader; - -public interface UploaderFactory { - Uploader getUploader(); -// Uploader getUploader(UploadFile uploadFile); -} diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java index d6e3188..28b9cdc 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.exception.UploadGeneralException; @@ -20,6 +21,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; @@ -28,12 +30,13 @@ import java.util.*; @Component public class AliyunOSSUploader extends Uploader { private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUploader.class); - + @Resource + QiwenFileConfig qiwenFileConfig; // private UploadFile uploadFile; - private String endpoint; - private String accessKeyId; - private String accessKeySecret; - private String bucketName; +// private String endpoint; +// private String accessKeyId; +// private String accessKeySecret; +// private String bucketName; // partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。 public static Map> partETagsMap = new HashMap>(); @@ -57,12 +60,12 @@ public class AliyunOSSUploader extends Uploader { List saveUploadFileList = new ArrayList<>(); StandardMultipartHttpServletRequest request = (StandardMultipartHttpServletRequest) httpServletRequest; - AliyunOSS aliyunOSS = (AliyunOSS) request.getAttribute("oss"); - - endpoint = aliyunOSS.getEndpoint(); - accessKeyId = aliyunOSS.getAccessKeyId(); - accessKeySecret = aliyunOSS.getAccessKeySecret(); - bucketName = aliyunOSS.getBucketName(); +// AliyunOSS aliyunOSS = (AliyunOSS) request.getAttribute("oss"); +// +// endpoint = aliyunOSS.getEndpoint(); +// accessKeyId = aliyunOSS.getAccessKeyId(); +// accessKeySecret = aliyunOSS.getAccessKeySecret(); +// bucketName = aliyunOSS.getBucketName(); boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); @@ -114,12 +117,12 @@ public class AliyunOSSUploader extends Uploader { synchronized (AliyunOSSUploader.class) { if (uploadPartRequestMap.get(uploadFile.getIdentifier()) == null) { - InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, ossFilePath.substring(1)); + InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(qiwenFileConfig.getAliyun().getOss().getBucketName(), ossFilePath.substring(1)); InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request); String uploadId = upresult.getUploadId(); UploadFileInfo uploadPartRequest = new UploadFileInfo(); - uploadPartRequest.setBucketName(bucketName); + uploadPartRequest.setBucketName(qiwenFileConfig.getAliyun().getOss().getBucketName()); uploadPartRequest.setKey(ossFilePath.substring(1)); uploadPartRequest.setUploadId(uploadId); uploadPartRequestMap.put(uploadFile.getIdentifier(), uploadPartRequest); @@ -190,7 +193,7 @@ public class AliyunOSSUploader extends Uploader { Collections.sort(partETags, Comparator.comparingInt(PartETag::getPartNumber)); UploadFileInfo uploadFileInfo = uploadPartRequestMap.get(uploadFile.getIdentifier()); CompleteMultipartUploadRequest completeMultipartUploadRequest = - new CompleteMultipartUploadRequest(bucketName, + new CompleteMultipartUploadRequest(qiwenFileConfig.getAliyun().getOss().getBucketName(), uploadFileInfo.getKey(), uploadFileInfo.getUploadId(), partETags); @@ -207,7 +210,7 @@ public class AliyunOSSUploader extends Uploader { private void listFile(UploadFile uploadFile) { // 列举已上传的分片,其中uploadId来自于InitiateMultipartUpload返回的结果。 - ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); + ListPartsRequest listPartsRequest = new ListPartsRequest(qiwenFileConfig.getAliyun().getOss().getBucketName(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); // 设置uploadId。 //listPartsRequest.setUploadId(uploadId); // 设置分页时每一页中分片数量为100个。默认列举1000个分片。 @@ -237,7 +240,7 @@ public class AliyunOSSUploader extends Uploader { */ private void cancelUpload(UploadFile uploadFile) { AbortMultipartUploadRequest abortMultipartUploadRequest = - new AbortMultipartUploadRequest(bucketName, uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); + new AbortMultipartUploadRequest(qiwenFileConfig.getAliyun().getOss().getBucketName(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId()); getClient(uploadFile).abortMultipartUpload(abortMultipartUploadRequest); } @@ -257,7 +260,7 @@ public class AliyunOSSUploader extends Uploader { private synchronized OSS getClient(UploadFile uploadFile) { OSS ossClient = null; if (ossMap.get(uploadFile.getIdentifier()) == null) { - ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + ossClient = new OSSClientBuilder().build(qiwenFileConfig.getAliyun().getOss().getEndpoint(), qiwenFileConfig.getAliyun().getOss().getAccessKeyId(), qiwenFileConfig.getAliyun().getOss().getAccessKeySecret()); ossMap.put(uploadFile.getIdentifier(), ossClient); } else { ossClient = ossMap.get(uploadFile.getIdentifier()); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java b/file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java similarity index 98% rename from file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java rename to file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java index 6acb4ba..027bffd 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/ChunkUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java @@ -26,11 +26,11 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; @Component -public class ChunkUploader extends Uploader { - private static final Logger logger = LoggerFactory.getLogger(ChunkUploader.class); +public class LocalStorageUploader extends Uploader { + private static final Logger logger = LoggerFactory.getLogger(LocalStorageUploader.class); // private UploadFile uploadFile; - public ChunkUploader() { + public LocalStorageUploader() { } // diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java index a5336e3..61bee29 100644 --- a/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java @@ -1,9 +1,11 @@ package com.qiwenshare.file.api; import com.qiwenshare.file.domain.StorageBean; +import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; public interface IFiletransferService { @@ -18,6 +20,8 @@ public interface IFiletransferService { */ void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId); + void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO); + StorageBean selectStorageBean(StorageBean storageBean); void insertStorageBean(StorageBean storageBean); diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index 096ae22..71b3a8f 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -14,7 +14,7 @@ import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.api.IRecoveryFileService; import com.qiwenshare.file.api.IUserFileService; import com.qiwenshare.file.api.IUserService; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.config.es.FileSearch; import com.qiwenshare.file.domain.*; import com.qiwenshare.file.dto.*; diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index 3c12a1d..799c59e 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -3,7 +3,6 @@ package com.qiwenshare.file.controller; import com.aliyun.oss.OSS; import com.aliyun.oss.model.OSSObject; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; -import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.cbb.DateUtil; import com.qiwenshare.common.operation.FileOperation; @@ -16,7 +15,7 @@ import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.api.IFiletransferService; import com.qiwenshare.file.api.IUserFileService; import com.qiwenshare.file.api.IUserService; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.domain.UserBean; @@ -34,7 +33,6 @@ import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -144,29 +142,7 @@ public class FiletransferController { @MyLog(operation = "下载文件", module = CURRENT_MODULE) @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) public void downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { - UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); - - String fileName = userFile.getFileName() + "." + userFile.getExtendName(); - try { - fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - response.setContentType("application/force-download");// 设置强制下载不打开 - response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 - - - FileBean fileBean = fileService.getById(userFile.getFileId()); - if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { - aliyunDownload(response, fileBean); - } else if (fileBean.getStorageType() == 0) { - localFileDownload(response, fileBean); - } else if (fileBean.getStorageType() == 1) { - aliyunDownload(response, fileBean); - } else if (fileBean.getStorageType() == 2) { - fastFDSDownload(response, fileBean); - } - + filetransferService.downloadFile(response, downloadFileDTO); } private void localFileDownload(HttpServletResponse response, FileBean fileBean) { diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java index 028557a..953d2b2 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java @@ -7,7 +7,7 @@ import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.util.JjwtUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IUserService; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.dto.user.RegisterDTO; import com.qiwenshare.file.vo.user.UserLoginVo; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java index 466b06d..281771a 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java @@ -8,7 +8,7 @@ import com.qiwenshare.common.oss.AliyunOSSDelete; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.api.IFileService; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.mapper.UserFileMapper; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index 5820e02..321dac7 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -1,26 +1,28 @@ package com.qiwenshare.file.service; +import java.io.UnsupportedEncodingException; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.domain.DownloadFile; import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.upload.factory.AliyunOSSUploaderFactory; -import com.qiwenshare.common.upload.factory.ChunkUploaderFactory; +//import com.qiwenshare.common.factory.FileOperationFactory; +import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.factory.FileOperationFactory; import com.qiwenshare.common.upload.Uploader; -import com.qiwenshare.common.upload.factory.FastDFSUploaderFactory; -import com.qiwenshare.common.upload.factory.UploaderFactory; + import com.qiwenshare.file.api.IFiletransferService; -import com.qiwenshare.common.domain.AliyunOSS; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.UserFile; +import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.domain.FileBean; @@ -37,27 +39,23 @@ public class FiletransferService implements IFiletransferService { StorageMapper storageMapper; @Resource FileMapper fileMapper; - @Resource QiwenFileConfig qiwenFileConfig; + @Resource UserFileMapper userFileMapper; @Resource - UploaderFactory fastDFSUploaderFactory; + FileOperationFactory fastDFSOperationFactory; @Resource - UploaderFactory aliyunOSSUploaderFactory; + FileOperationFactory aliyunOSSOperationFactory; @Resource - UploaderFactory chunkUploaderFactory; - - + FileOperationFactory localStorageOperationFactory; @Override public void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId) { - AliyunOSS oss = qiwenFileConfig.getAliyun().getOss(); - String storyType = qiwenFileConfig.getStorageType(); - request.setAttribute("oss", oss); - Uploader uploader; + + Uploader uploader = null; UploadFile uploadFile = new UploadFile(); uploadFile.setChunkNumber(UploadFileDto.getChunkNumber()); uploadFile.setChunkSize(UploadFileDto.getChunkSize()); @@ -66,12 +64,13 @@ public class FiletransferService implements IFiletransferService { uploadFile.setTotalSize(UploadFileDto.getTotalSize()); uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); synchronized (FiletransferService.class) { - if (oss.isEnabled()) { - uploader = aliyunOSSUploaderFactory.getUploader(); - } else if ("FastFDS".equals(storyType)) { - uploader = fastDFSUploaderFactory.getUploader(); - } else { - uploader = chunkUploaderFactory.getUploader(); + String storageType = qiwenFileConfig.getStorageType(); + if ("0".equals(storageType)) { + uploader = localStorageOperationFactory.getUploader(); + } else if ("1".equals(storageType)) { + uploader = aliyunOSSOperationFactory.getUploader(); + } else if ("2".equals(storageType)) { + uploader = fastDFSOperationFactory.getUploader(); } } @@ -118,6 +117,37 @@ public class FiletransferService implements IFiletransferService { } } + @Override + public void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) { + UserFile userFile = userFileMapper.selectById(downloadFileDTO.getUserFileId()); + + String fileName = userFile.getFileName() + "." + userFile.getExtendName(); + try { + fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 + httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 + + + FileBean fileBean = fileMapper.selectById(userFile.getFileId()); + Downloader downloader = null; + if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { + downloader = aliyunOSSOperationFactory.getDownloader(); + } else if (fileBean.getStorageType() == 0) { + downloader = localStorageOperationFactory.getDownloader(); + } else if (fileBean.getStorageType() == 1) { + downloader = aliyunOSSOperationFactory.getDownloader(); + } else if (fileBean.getStorageType() == 2) { + downloader = fastDFSOperationFactory.getDownloader(); + } + DownloadFile uploadFile = new DownloadFile(); + uploadFile.setFileUrl(fileBean.getFileUrl()); + uploadFile.setTimeStampName(fileBean.getTimeStampName()); + downloader.download(httpServletResponse, uploadFile); + } + @Override public StorageBean selectStorageBean(StorageBean storageBean) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java index 8b90829..a33a857 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java @@ -4,12 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiwenshare.common.cbb.DateUtil; -import com.qiwenshare.common.oss.AliyunOSSRename; import com.qiwenshare.file.api.IUserFileService; -import com.qiwenshare.file.config.QiwenFileConfig; +import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.RecoveryFile; -import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.mapper.RecoveryFileMapper; @@ -20,7 +18,6 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; -import java.util.Map; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.Executors; diff --git a/file-web/src/main/resources/config/application.properties b/file-web/src/main/resources/config/application.properties index 9336bdf..8522145 100644 --- a/file-web/src/main/resources/config/application.properties +++ b/file-web/src/main/resources/config/application.properties @@ -51,11 +51,11 @@ mybatis-plus.global-config.banner=false qiwen-file.remote-login=false qiwen-file.share-mode=false -#FastFDS -#qiwen-file.storage-type=FastFDS + +qiwen-file.storage-type=0 #是否启用阿里云oss -qiwen-file.aliyun.oss.enabled=false +#qiwen-file.aliyun.oss.enabled=false #阿里云oss基本配置 qiwen-file.aliyun.oss.endpoint= qiwen-file.aliyun.oss.access-key-id= diff --git a/file-web/src/main/resources/mybatis/mapper/UserFileMapper.xml b/file-web/src/main/resources/mybatis/mapper/UserFileMapper.xml index 009dea1..f41756b 100644 --- a/file-web/src/main/resources/mybatis/mapper/UserFileMapper.xml +++ b/file-web/src/main/resources/mybatis/mapper/UserFileMapper.xml @@ -30,9 +30,7 @@ limit #{beginCount}, #{pageCount} - - + select * from userfile + limit #{beginCount}, #{pageCount} From fc77d48251f02b328dd58a67541105478bb4d7f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= Date: Wed, 24 Mar 2021 10:38:44 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/QiwenFileConfig.java | 1 + .../qiwenshare/common/domain/DeleteFile.java | 9 + .../NotSameFileExpection.java | 2 +- .../factory/AliyunOSSOperationFactory.java | 20 +- .../factory/FastDFSOperationFactory.java | 23 +- .../common/factory/FileOperationFactory.java | 7 +- .../factory/LocalStorageOperationFactory.java | 21 +- .../common/factory/NormalUploaderFactory.java | 24 -- .../common/operation/delete/Deleter.java | 7 + .../delete/product/AliyunOSSDeleter.java | 32 +++ .../delete/product/FastDFSDeleter.java | 17 ++ .../delete/product/LocalStorageDeleter.java | 19 ++ .../{ => operation}/download/Downloader.java | 4 +- .../download/product/AliyunOSSDownloader.java | 22 +- .../download/product/FastDFSDownloader.java | 5 +- .../product/LocalStorageDownloader.java | 6 +- .../{ => operation}/upload/Uploader.java | 7 +- .../upload/product/AliyunOSSUploader.java | 34 +-- .../upload/product/FastDFSUploader.java | 20 +- .../upload/product/LocalStorageUploader.java | 6 +- .../upload/product/NormalUploader.java | 0 .../common/oss/AliyunOSSDelete.java | 55 ----- .../common/oss/AliyunOSSDownload.java | 38 --- .../common/oss/AliyunOSSRename.java | 59 ----- .../common/{cbb => result}/RestResult.java | 4 +- .../{cbb => result}/ResultCodeEnum.java | 2 +- .../common/{cbb => util}/CollectUtil.java | 2 +- .../common/{cbb => util}/DateUtil.java | 2 +- .../qiwenshare/common/util/OfficeUtil.java | 4 - .../common/util/RedisLockUtils.java | 218 ++++++++++++++++++ .../qiwenshare/file/advice/CMSException.java | 2 +- .../advice/GlobalExceptionHandlerAdvice.java | 5 +- .../com/qiwenshare/file/aop/WebLogAcpect.java | 2 +- .../com/qiwenshare/file/api/IFileService.java | 2 +- .../file/api/IFiletransferService.java | 3 +- .../com/qiwenshare/file/api/IUserService.java | 4 +- .../file/controller/FileController.java | 33 ++- .../controller/FiletransferController.java | 35 +-- .../controller/RecoveryFileController.java | 4 +- .../file/controller/ShareController.java | 4 +- .../file/controller/TaskController.java | 5 +- .../file/controller/UserController.java | 2 +- .../qiwenshare/file/service/FileService.java | 55 ++--- .../file/service/FiletransferService.java | 26 ++- .../file/service/RecoveryFileService.java | 3 +- .../file/service/UserFileService.java | 2 +- .../qiwenshare/file/service/UserService.java | 6 +- .../file/util/OperationLogUtil.java | 5 +- .../resources/config/application.properties | 2 +- 49 files changed, 490 insertions(+), 380 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/domain/DeleteFile.java rename file-common/src/main/java/com/qiwenshare/common/{cbb => exception}/NotSameFileExpection.java (76%) delete mode 100644 file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/operation/delete/Deleter.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/operation/delete/product/AliyunOSSDeleter.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/operation/delete/product/FastDFSDeleter.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/operation/delete/product/LocalStorageDeleter.java rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/download/Downloader.java (68%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/download/product/AliyunOSSDownloader.java (70%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/download/product/FastDFSDownloader.java (92%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/download/product/LocalStorageDownloader.java (86%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/upload/Uploader.java (92%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/upload/product/AliyunOSSUploader.java (91%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/upload/product/FastDFSUploader.java (94%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/upload/product/LocalStorageUploader.java (97%) rename file-common/src/main/java/com/qiwenshare/common/{ => operation}/upload/product/NormalUploader.java (100%) delete mode 100644 file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDelete.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDownload.java delete mode 100644 file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSRename.java rename file-common/src/main/java/com/qiwenshare/common/{cbb => result}/RestResult.java (97%) rename file-common/src/main/java/com/qiwenshare/common/{cbb => result}/ResultCodeEnum.java (94%) rename file-common/src/main/java/com/qiwenshare/common/{cbb => util}/CollectUtil.java (97%) rename file-common/src/main/java/com/qiwenshare/common/{cbb => util}/DateUtil.java (98%) delete mode 100644 file-common/src/main/java/com/qiwenshare/common/util/OfficeUtil.java create mode 100644 file-common/src/main/java/com/qiwenshare/common/util/RedisLockUtils.java diff --git a/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java b/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java index 33a7958..5cbeaaf 100644 --- a/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java +++ b/file-common/src/main/java/com/qiwenshare/common/config/QiwenFileConfig.java @@ -12,6 +12,7 @@ public class QiwenFileConfig { private boolean shareMode; private String storageType; + private String cacheMode; private AliyunConfig aliyun = new AliyunConfig(); diff --git a/file-common/src/main/java/com/qiwenshare/common/domain/DeleteFile.java b/file-common/src/main/java/com/qiwenshare/common/domain/DeleteFile.java new file mode 100644 index 0000000..af986ba --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/domain/DeleteFile.java @@ -0,0 +1,9 @@ +package com.qiwenshare.common.domain; + +import lombok.Data; + +@Data +public class DeleteFile { + private String fileUrl; + private String timeStampName; +} diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/NotSameFileExpection.java b/file-common/src/main/java/com/qiwenshare/common/exception/NotSameFileExpection.java similarity index 76% rename from file-common/src/main/java/com/qiwenshare/common/cbb/NotSameFileExpection.java rename to file-common/src/main/java/com/qiwenshare/common/exception/NotSameFileExpection.java index b4a6d03..9ebd262 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/NotSameFileExpection.java +++ b/file-common/src/main/java/com/qiwenshare/common/exception/NotSameFileExpection.java @@ -1,4 +1,4 @@ -package com.qiwenshare.common.cbb; +package com.qiwenshare.common.exception; public class NotSameFileExpection extends Exception { public NotSameFileExpection() { diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java index f14f9f4..44b4bfb 100644 --- a/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/AliyunOSSOperationFactory.java @@ -1,9 +1,14 @@ package com.qiwenshare.common.factory; -import com.qiwenshare.common.download.Downloader; -import com.qiwenshare.common.download.product.AliyunOSSDownloader; -import com.qiwenshare.common.upload.product.AliyunOSSUploader; -import com.qiwenshare.common.upload.Uploader; + +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.operation.delete.product.AliyunOSSDeleter; + +import com.qiwenshare.common.operation.download.Downloader; +import com.qiwenshare.common.operation.download.product.AliyunOSSDownloader; +import com.qiwenshare.common.operation.upload.Uploader; +import com.qiwenshare.common.operation.upload.product.AliyunOSSUploader; + import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -14,6 +19,8 @@ public class AliyunOSSOperationFactory implements FileOperationFactory { AliyunOSSUploader aliyunOSSUploader; @Resource AliyunOSSDownloader aliyunOSSDownloader; + @Resource + AliyunOSSDeleter aliyunOSSDeleter; @Override public Uploader getUploader() { return aliyunOSSUploader; @@ -24,4 +31,9 @@ public class AliyunOSSOperationFactory implements FileOperationFactory { return aliyunOSSDownloader; } + @Override + public Deleter getDeleter() { + return aliyunOSSDeleter; + } + } diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java index e998851..849fdf8 100644 --- a/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/FastDFSOperationFactory.java @@ -1,9 +1,11 @@ package com.qiwenshare.common.factory; -import com.qiwenshare.common.download.Downloader; -import com.qiwenshare.common.download.product.FastDFSDownloader; -import com.qiwenshare.common.upload.Uploader; -import com.qiwenshare.common.upload.product.FastDFSUploader; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.operation.delete.product.FastDFSDeleter; +import com.qiwenshare.common.operation.download.Downloader; +import com.qiwenshare.common.operation.download.product.FastDFSDownloader; +import com.qiwenshare.common.operation.upload.Uploader; +import com.qiwenshare.common.operation.upload.product.FastDFSUploader; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -11,12 +13,12 @@ import javax.annotation.Resource; @Component public class FastDFSOperationFactory implements FileOperationFactory { -// @Resource -// AppendFileStorageClient defaultAppendFileStorageClient; @Resource FastDFSUploader fastDFSUploader; @Resource FastDFSDownloader fastDFSDownloader; + @Resource + FastDFSDeleter fastDFSDeleter; @Override public Uploader getUploader() { return fastDFSUploader; @@ -27,9 +29,10 @@ public class FastDFSOperationFactory implements FileOperationFactory { return fastDFSDownloader; } -// @Override -// public Uploader getUploader(UploadFile uploadFile) { -// return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); -// } + @Override + public Deleter getDeleter() { + return fastDFSDeleter; + } + } diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java index 4db416d..15da8ed 100644 --- a/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/FileOperationFactory.java @@ -1,10 +1,11 @@ package com.qiwenshare.common.factory; -import com.qiwenshare.common.download.Downloader; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.operation.download.Downloader; +import com.qiwenshare.common.operation.upload.Uploader; public interface FileOperationFactory { Uploader getUploader(); Downloader getDownloader(); -// Uploader getUploader(UploadFile uploadFile); + Deleter getDeleter(); } diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java index 67e445d..d965ebf 100644 --- a/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/factory/LocalStorageOperationFactory.java @@ -1,9 +1,11 @@ package com.qiwenshare.common.factory; -import com.qiwenshare.common.download.Downloader; -import com.qiwenshare.common.download.product.LocalStorageDownloader; -import com.qiwenshare.common.upload.product.LocalStorageUploader; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.operation.delete.product.LocalStorageDeleter; +import com.qiwenshare.common.operation.download.Downloader; +import com.qiwenshare.common.operation.download.product.LocalStorageDownloader; +import com.qiwenshare.common.operation.upload.product.LocalStorageUploader; +import com.qiwenshare.common.operation.upload.Uploader; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -12,12 +14,14 @@ import javax.annotation.Resource; public class LocalStorageOperationFactory implements FileOperationFactory{ @Resource - LocalStorageUploader ChunkUploader; + LocalStorageUploader localStorageUploader; @Resource LocalStorageDownloader localStorageDownloader; + @Resource + LocalStorageDeleter localStorageDeleter; @Override public Uploader getUploader() { - return ChunkUploader; + return localStorageUploader; } @Override @@ -25,5 +29,10 @@ public class LocalStorageOperationFactory implements FileOperationFactory{ return localStorageDownloader; } + @Override + public Deleter getDeleter() { + return localStorageDeleter; + } + } diff --git a/file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java deleted file mode 100644 index 40d5466..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/factory/NormalUploaderFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -//package com.qiwenshare.common.factory; -// -//import com.github.tobato.fastdfs.service.AppendFileStorageClient; -//import com.qiwenshare.common.domain.UploadFile; -//import com.qiwenshare.common.upload.product.NormalUploader; -//import com.qiwenshare.common.upload.Uploader; -//import org.springframework.stereotype.Component; -// -//import javax.annotation.Resource; -// -//@Component -//public class NormalUploaderFactory implements UploaderFactory { -// -// @Override -// public Uploader getUploader() { -// return new NormalUploader(); -// } -// -// @Override -// public Uploader getUploader(UploadFile uploadFile) { -// return new NormalUploader(); -// } -// -//} diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/delete/Deleter.java b/file-common/src/main/java/com/qiwenshare/common/operation/delete/Deleter.java new file mode 100644 index 0000000..c86f1d3 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/operation/delete/Deleter.java @@ -0,0 +1,7 @@ +package com.qiwenshare.common.operation.delete; + +import com.qiwenshare.common.domain.DeleteFile; + +public abstract class Deleter { + public abstract void delete(DeleteFile deleteFile); +} diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/AliyunOSSDeleter.java b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/AliyunOSSDeleter.java new file mode 100644 index 0000000..c1a5c6d --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/AliyunOSSDeleter.java @@ -0,0 +1,32 @@ +package com.qiwenshare.common.operation.delete.product; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.qiwenshare.common.config.QiwenFileConfig; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.domain.DeleteFile; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class AliyunOSSDeleter extends Deleter { + @Resource + QiwenFileConfig qiwenFileConfig; + @Override + public void delete(DeleteFile deleteFile) { +// AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), deleteFile.getFileUrl().substring(1)); + String endpoint = qiwenFileConfig.getAliyun().getOss().getEndpoint(); + String accessKeyId = qiwenFileConfig.getAliyun().getOss().getAccessKeyId(); + String accessKeySecret = qiwenFileConfig.getAliyun().getOss().getAccessKeySecret(); + String bucketName = qiwenFileConfig.getAliyun().getOss().getBucketName(); + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + ossClient.deleteObject(bucketName, deleteFile.getFileUrl().substring(1)); + + + + // 关闭OSSClient。 + ossClient.shutdown(); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/FastDFSDeleter.java b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/FastDFSDeleter.java new file mode 100644 index 0000000..da0581c --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/FastDFSDeleter.java @@ -0,0 +1,17 @@ +package com.qiwenshare.common.operation.delete.product; + +import com.github.tobato.fastdfs.service.FastFileStorageClient; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.domain.DeleteFile; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class FastDFSDeleter extends Deleter { + @Autowired + private FastFileStorageClient fastFileStorageClient; + @Override + public void delete(DeleteFile deleteFile) { + fastFileStorageClient.deleteFile(deleteFile.getFileUrl()); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/LocalStorageDeleter.java b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/LocalStorageDeleter.java new file mode 100644 index 0000000..f108366 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/operation/delete/product/LocalStorageDeleter.java @@ -0,0 +1,19 @@ +package com.qiwenshare.common.operation.delete.product; + +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.domain.DeleteFile; +import com.qiwenshare.common.operation.FileOperation; +import com.qiwenshare.common.util.FileUtil; +import com.qiwenshare.common.util.PathUtil; +import org.springframework.stereotype.Component; + +@Component +public class LocalStorageDeleter extends Deleter { + @Override + public void delete(DeleteFile deleteFile) { + FileOperation.deleteFile(PathUtil.getStaticPath() + deleteFile.getFileUrl()); + if (FileUtil.isImageFile(FileUtil.getFileExtendName(deleteFile.getFileUrl()))) { + FileOperation.deleteFile(PathUtil.getStaticPath() + deleteFile.getFileUrl().replace(deleteFile.getTimeStampName(), deleteFile.getTimeStampName() + "_min")); + } + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java similarity index 68% rename from file-common/src/main/java/com/qiwenshare/common/download/Downloader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java index 508c04e..c8793e4 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/Downloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java @@ -1,10 +1,8 @@ -package com.qiwenshare.common.download; +package com.qiwenshare.common.operation.download; import com.qiwenshare.common.domain.DownloadFile; -import com.qiwenshare.common.domain.UploadFile; import javax.servlet.http.HttpServletResponse; -import java.util.List; public abstract class Downloader { public abstract void download(HttpServletResponse httpServletResponse, DownloadFile uploadFile); diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java similarity index 70% rename from file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java index 5685be2..acdb989 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/AliyunOSSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java @@ -1,13 +1,12 @@ -package com.qiwenshare.common.download.product; +package com.qiwenshare.common.operation.download.product; import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.OSSObject; -import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.config.QiwenFileConfig; +import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.domain.DownloadFile; -import com.qiwenshare.common.download.Downloader; -import com.qiwenshare.common.oss.AliyunOSSDownload; -import org.springframework.beans.factory.annotation.Autowired; +import com.qiwenshare.common.operation.download.Downloader; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -23,10 +22,11 @@ public class AliyunOSSDownloader extends Downloader { QiwenFileConfig qiwenFileConfig; @Override public void download(HttpServletResponse httpServletResponse, DownloadFile downloadFile) { + BufferedInputStream bis = null; byte[] buffer = new byte[1024]; - AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); - OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); + + OSS ossClient = createOSSClient(qiwenFileConfig.getAliyun().getOss()); OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), downloadFile.getTimeStampName()); InputStream inputStream = ossObject.getObjectContent(); try { @@ -51,4 +51,12 @@ public class AliyunOSSDownloader extends Downloader { } ossClient.shutdown(); } + + public OSS createOSSClient(AliyunOSS aliyunOSS) { + String endpoint = aliyunOSS.getEndpoint(); + String accessKeyId = aliyunOSS.getAccessKeyId(); + String accessKeySecret = aliyunOSS.getAccessKeySecret(); + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + return ossClient; + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java similarity index 92% rename from file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java index 5371474..7d661b1 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/FastDFSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java @@ -1,10 +1,9 @@ -package com.qiwenshare.common.download.product; +package com.qiwenshare.common.operation.download.product; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.domain.DownloadFile; -import com.qiwenshare.common.domain.UploadFile; -import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.operation.download.Downloader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java similarity index 86% rename from file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java index 7c86ee9..8b5063d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/download/product/LocalStorageDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java @@ -1,11 +1,9 @@ -package com.qiwenshare.common.download.product; +package com.qiwenshare.common.operation.download.product; -import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.domain.DownloadFile; -import com.qiwenshare.common.download.Downloader; import com.qiwenshare.common.operation.FileOperation; +import com.qiwenshare.common.operation.download.Downloader; import com.qiwenshare.common.util.PathUtil; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletResponse; diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/Uploader.java similarity index 92% rename from file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/upload/Uploader.java index eafdd13..daedc7c 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/Uploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/Uploader.java @@ -1,10 +1,9 @@ -package com.qiwenshare.common.upload; +package com.qiwenshare.common.operation.upload; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.util.PathUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; -import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import java.io.File; @@ -24,14 +23,11 @@ public abstract class Uploader { // 文件大小限制,单位KB public final int maxSize = 10000000; -// protected StandardMultipartHttpServletRequest request = null; - public abstract List upload(HttpServletRequest request, UploadFile uploadFile); /** * 根据字符串创建本地目录 并按照日期建立子目录返回 * - * @param path * @return */ protected String getSaveFilePath() { @@ -73,7 +69,6 @@ public abstract class Uploader { } public synchronized boolean checkUploadStatus(UploadFile param, File confFile) throws IOException { - //File confFile = new File(savePath, timeStampName + ".conf"); RandomAccessFile confAccessFile = new RandomAccessFile(confFile, "rw"); //设置文件长度 confAccessFile.setLength(param.getTotalChunks()); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java similarity index 91% rename from file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java index 28b9cdc..ca2cf2f 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java @@ -1,14 +1,13 @@ -package com.qiwenshare.common.upload.product; +package com.qiwenshare.common.operation.upload.product; import com.alibaba.fastjson.JSON; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import com.qiwenshare.common.config.QiwenFileConfig; -import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.exception.UploadGeneralException; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.upload.Uploader; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import lombok.Data; @@ -24,7 +23,6 @@ import org.springframework.web.multipart.support.StandardMultipartHttpServletReq import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; -import java.io.IOException; import java.io.InputStream; import java.util.*; @Component @@ -32,11 +30,7 @@ public class AliyunOSSUploader extends Uploader { private static final Logger logger = LoggerFactory.getLogger(AliyunOSSUploader.class); @Resource QiwenFileConfig qiwenFileConfig; -// private UploadFile uploadFile; -// private String endpoint; -// private String accessKeyId; -// private String accessKeySecret; -// private String bucketName; + // partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。 public static Map> partETagsMap = new HashMap>(); @@ -46,40 +40,22 @@ public class AliyunOSSUploader extends Uploader { public static Map timeStampNameMap = new HashMap<>(); - public AliyunOSSUploader() { - - } - -// public AliyunOSSUploader(UploadFile uploadFile) { -// this.uploadFile = uploadFile; -// } - @Override public List upload(HttpServletRequest httpServletRequest, UploadFile uploadFile) { logger.info("开始上传upload"); List saveUploadFileList = new ArrayList<>(); StandardMultipartHttpServletRequest request = (StandardMultipartHttpServletRequest) httpServletRequest; -// AliyunOSS aliyunOSS = (AliyunOSS) request.getAttribute("oss"); -// -// endpoint = aliyunOSS.getEndpoint(); -// accessKeyId = aliyunOSS.getAccessKeyId(); -// accessKeySecret = aliyunOSS.getAccessKeySecret(); -// bucketName = aliyunOSS.getBucketName(); + boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { throw new UploadGeneralException("未包含文件上传域"); -// UploadFile uploadFile = new UploadFile(); -// uploadFile.setSuccess(0); -// uploadFile.setMessage("未包含文件上传域"); -// saveUploadFileList.add(uploadFile); -// return saveUploadFileList; } DiskFileItemFactory dff = new DiskFileItemFactory();//1、创建工厂 String savePath = getSaveFilePath(); dff.setRepository(new File(savePath)); - ServletFileUpload sfu = new ServletFileUpload(dff);//2、创建文件上传解析器 + ServletFileUpload sfu = new ServletFileUpload(dff); sfu.setSizeMax(this.maxSize * 1024L); sfu.setHeaderEncoding("utf-8");//3、解决文件名的中文乱码 Iterator iter = request.getFileNames(); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java similarity index 94% rename from file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java index f540628..1924a3d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java @@ -1,10 +1,10 @@ -package com.qiwenshare.common.upload.product; +package com.qiwenshare.common.operation.upload.product; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.exception.UploadGeneralException; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.upload.Uploader; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import lombok.extern.slf4j.Slf4j; @@ -25,27 +25,11 @@ public class FastDFSUploader extends Uploader { @Resource AppendFileStorageClient defaultAppendFileStorageClient; -// UploadFile uploadFile; - private static Map CURRENT_UPLOAD_CHUNK_NUMBER = new HashMap<>(); private static Map UPLOADED_SIZE = new HashMap<>(); private static Map STORE_PATH = new HashMap<>(); private static Map LOCK_MAP = new HashMap<>(); - public FastDFSUploader() { - - } - -// public FastDFSUploader(UploadFile uploadFile) { -// this.uploadFile = uploadFile; -// } -// -// public FastDFSUploader(UploadFile uploadFile, AppendFileStorageClient defaultAppendFileStorageClient) { -//// this.uploadFile = uploadFile; -// this.defaultAppendFileStorageClient = defaultAppendFileStorageClient; -// } - - @Override public List upload(HttpServletRequest request, UploadFile uploadFile) { log.info("开始上传upload"); diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java similarity index 97% rename from file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java index 027bffd..b9e5295 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/product/LocalStorageUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java @@ -1,10 +1,10 @@ -package com.qiwenshare.common.upload.product; +package com.qiwenshare.common.operation.upload.product; -import com.qiwenshare.common.cbb.NotSameFileExpection; +import com.qiwenshare.common.exception.NotSameFileExpection; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.exception.UploadGeneralException; import com.qiwenshare.common.operation.ImageOperation; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.upload.Uploader; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import org.apache.commons.codec.digest.DigestUtils; diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/NormalUploader.java similarity index 100% rename from file-common/src/main/java/com/qiwenshare/common/upload/product/NormalUploader.java rename to file-common/src/main/java/com/qiwenshare/common/operation/upload/product/NormalUploader.java diff --git a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDelete.java b/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDelete.java deleted file mode 100644 index a21ac15..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDelete.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * 示例说明 - * - * HelloOSS是OSS Java SDK的示例程序,您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。 - * 运行方法请参考README。 - * - * 本示例中的并不包括OSS Java SDK的所有功能,详细功能及使用方法,请参看“SDK手册 > Java-SDK”, - * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/。 - * - * 调用OSS Java SDK的方法时,抛出异常表示有错误发生;没有抛出异常表示成功执行。 - * 当错误发生时,OSS Java SDK的方法会抛出异常,异常中包括错误码、错误信息,详细请参看“SDK手册 > Java-SDK > 异常处理”, - * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response。 - * - * OSS控制台可以直观的看到您调用OSS Java SDK的结果,OSS控制台地址是:https://oss.console.aliyun.com/index#/。 - * OSS控制台使用方法请参看文档中心的“控制台用户指南”, 指南的来链接地址是:https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide。 - * - * OSS的文档中心地址是:https://help.aliyun.com/document_detail/oss/user_guide/overview.html。 - * OSS Java SDK的文档地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk。 - * - */ - -package com.qiwenshare.common.oss; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.model.ObjectMetadata; -import com.qiwenshare.common.domain.AliyunOSS; -import com.qiwenshare.common.util.FileUtil; - -import java.io.InputStream; - - -public class AliyunOSSDelete { - - - /** - * 流式上传 - */ - public static void deleteObject(AliyunOSS aliyunOSS, String objectName) { - String endpoint = aliyunOSS.getEndpoint(); - String accessKeyId = aliyunOSS.getAccessKeyId(); - String accessKeySecret = aliyunOSS.getAccessKeySecret(); - String bucketName = aliyunOSS.getBucketName(); - OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); - - ossClient.deleteObject(bucketName, objectName); - - - - // 关闭OSSClient。 - ossClient.shutdown(); - } - - -} diff --git a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDownload.java b/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDownload.java deleted file mode 100644 index 91432e8..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSDownload.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.qiwenshare.common.oss; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.model.OSSObject; -import com.qiwenshare.common.domain.AliyunOSS; - -import java.io.InputStream; - -public class AliyunOSSDownload { - private String endpoint = ""; - private String accessKeyId = ""; - private String accessKeySecret = ""; - private String bucketName = ""; - public OSS createOSSClient(AliyunOSS aliyunOSS) { - String endpoint = aliyunOSS.getEndpoint(); - String accessKeyId = aliyunOSS.getAccessKeyId(); - String accessKeySecret = aliyunOSS.getAccessKeySecret(); - this.bucketName = aliyunOSS.getBucketName(); - OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); - return ossClient; - } - - /** - * 流式下载 - */ - public InputStream streamDownload(String objectName) { - - // 创建OSSClient实例。 - OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); - - // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。 - OSSObject ossObject = ossClient.getObject(bucketName, objectName); - return ossObject.getObjectContent(); - - } - -} diff --git a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSRename.java b/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSRename.java deleted file mode 100644 index 4113ae5..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/oss/AliyunOSSRename.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * 示例说明 - * - * HelloOSS是OSS Java SDK的示例程序,您可以修改endpoint、accessKeyId、accessKeySecret、bucketName后直接运行。 - * 运行方法请参考README。 - * - * 本示例中的并不包括OSS Java SDK的所有功能,详细功能及使用方法,请参看“SDK手册 > Java-SDK”, - * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/preface.html?spm=5176.docoss/sdk/java-sdk/。 - * - * 调用OSS Java SDK的方法时,抛出异常表示有错误发生;没有抛出异常表示成功执行。 - * 当错误发生时,OSS Java SDK的方法会抛出异常,异常中包括错误码、错误信息,详细请参看“SDK手册 > Java-SDK > 异常处理”, - * 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/exception.html?spm=5176.docoss/api-reference/error-response。 - * - * OSS控制台可以直观的看到您调用OSS Java SDK的结果,OSS控制台地址是:https://oss.console.aliyun.com/index#/。 - * OSS控制台使用方法请参看文档中心的“控制台用户指南”, 指南的来链接地址是:https://help.aliyun.com/document_detail/oss/getting-started/get-started.html?spm=5176.docoss/user_guide。 - * - * OSS的文档中心地址是:https://help.aliyun.com/document_detail/oss/user_guide/overview.html。 - * OSS Java SDK的文档地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/install.html?spm=5176.docoss/sdk/java-sdk。 - * - */ - -package com.qiwenshare.common.oss; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.model.CopyObjectResult; -import com.aliyun.oss.model.ObjectMetadata; -import com.qiwenshare.common.domain.AliyunOSS; - -import java.io.InputStream; - - -public class AliyunOSSRename { - - /** - * 流式上传 - */ - public static void rename(AliyunOSS aliyunOSS, String sourceObjectName, String destinationObjectName) { - String endpoint = aliyunOSS.getEndpoint(); - String accessKeyId = aliyunOSS.getAccessKeyId(); - String accessKeySecret = aliyunOSS.getAccessKeySecret(); - String bucketName = aliyunOSS.getBucketName(); - OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); - CopyObjectResult result = ossClient.copyObject(bucketName, sourceObjectName, bucketName, destinationObjectName); - - ossClient.deleteObject(bucketName, sourceObjectName); - ObjectMetadata metadata = new ObjectMetadata(); -// if ("pdf".equals(FileUtil.getFileType(objectName))) { -// metadata.setContentDisposition("attachment"); -// } - -// ossClient.putObject(bucketName, objectName, inputStream, metadata); - - - // 关闭OSSClient。 - ossClient.shutdown(); - } - -} diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/RestResult.java b/file-common/src/main/java/com/qiwenshare/common/result/RestResult.java similarity index 97% rename from file-common/src/main/java/com/qiwenshare/common/cbb/RestResult.java rename to file-common/src/main/java/com/qiwenshare/common/result/RestResult.java index d1828d6..361f3fd 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/RestResult.java +++ b/file-common/src/main/java/com/qiwenshare/common/result/RestResult.java @@ -1,10 +1,8 @@ -package com.qiwenshare.common.cbb; +package com.qiwenshare.common.result; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.Map; - /** * 统一结果返回 * @param diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java b/file-common/src/main/java/com/qiwenshare/common/result/ResultCodeEnum.java similarity index 94% rename from file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java rename to file-common/src/main/java/com/qiwenshare/common/result/ResultCodeEnum.java index 1285a9d..613416c 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/ResultCodeEnum.java +++ b/file-common/src/main/java/com/qiwenshare/common/result/ResultCodeEnum.java @@ -1,4 +1,4 @@ -package com.qiwenshare.common.cbb; +package com.qiwenshare.common.result; import lombok.Getter; diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/CollectUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/CollectUtil.java similarity index 97% rename from file-common/src/main/java/com/qiwenshare/common/cbb/CollectUtil.java rename to file-common/src/main/java/com/qiwenshare/common/util/CollectUtil.java index a127ef6..e8fd047 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/CollectUtil.java +++ b/file-common/src/main/java/com/qiwenshare/common/util/CollectUtil.java @@ -1,4 +1,4 @@ -package com.qiwenshare.common.cbb; +package com.qiwenshare.common.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/DateUtil.java similarity index 98% rename from file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java rename to file-common/src/main/java/com/qiwenshare/common/util/DateUtil.java index cb8edbe..6000bd4 100644 --- a/file-common/src/main/java/com/qiwenshare/common/cbb/DateUtil.java +++ b/file-common/src/main/java/com/qiwenshare/common/util/DateUtil.java @@ -1,4 +1,4 @@ -package com.qiwenshare.common.cbb; +package com.qiwenshare.common.util; import java.text.DateFormat; import java.text.ParseException; diff --git a/file-common/src/main/java/com/qiwenshare/common/util/OfficeUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/OfficeUtil.java deleted file mode 100644 index a04c354..0000000 --- a/file-common/src/main/java/com/qiwenshare/common/util/OfficeUtil.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.qiwenshare.common.util; - -public class OfficeUtil { -} diff --git a/file-common/src/main/java/com/qiwenshare/common/util/RedisLockUtils.java b/file-common/src/main/java/com/qiwenshare/common/util/RedisLockUtils.java new file mode 100644 index 0000000..34e5a44 --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/util/RedisLockUtils.java @@ -0,0 +1,218 @@ +package com.qiwenshare.common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.redis.connection.RedisStringCommands; +import org.springframework.data.redis.connection.ReturnType; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.types.Expiration; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * redis实现分布式锁 + * + */ +public class RedisLockUtils { + + private static final Logger log = LoggerFactory.getLogger(RedisLockUtils.class); + + /** + * 默认轮休获取锁间隔时间, 单位:毫秒 + */ + private static final int DEFAULT_ACQUIRE_RESOLUTION_MILLIS = 100; + + private static final String UNLOCK_LUA; + + static { + StringBuilder lua = new StringBuilder(); + lua.append("if redis.call(\"get\",KEYS[1]) == ARGV[1] "); + lua.append("then "); + lua.append(" return redis.call(\"del\",KEYS[1]) "); + lua.append("else "); + lua.append(" return 0 "); + lua.append("end "); + UNLOCK_LUA = lua.toString(); + } + + private RedisTemplate redisTemplate; + + private final ThreadLocal> lockMap = new ThreadLocal<>(); + + public RedisLockUtils(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + /** + * 获取锁,没有获取到则一直等待 + * + * @param key redis key + * @param expire 锁过期时间, 单位 秒 + */ + public void lock(final String key, long expire) { + try { + acquireLock(key, expire, -1); + } catch (Exception e) { + throw new RuntimeException("acquire lock exception", e); + } + } + + /** + * 获取锁,指定时间内没有获取到,返回false。否则 返回true + * + * @param key redis key + * @param expire 锁过期时间, 单位 秒 + * @param waitTime 获取锁超时时间, -1代表永不超时, 单位 秒 + */ + public boolean tryLock(final String key, long expire, long waitTime) { + try { + return acquireLock(key, expire, waitTime); + } catch (Exception e) { + throw new RuntimeException("acquire lock exception", e); + } + } + + /** + * 释放锁 + * + * @param key redis key + */ + public void unlock(String key) { + try { + release(key); + } catch (Exception e) { + throw new RuntimeException("release lock exception", e); + } + } + + /** + * @param key redis key + * @param expire 锁过期时间, 单位 秒 + * @param waitTime 获取锁超时时间, -1代表永不超时, 单位 秒 + * @return if true success else fail + * @throws InterruptedException 阻塞方法收到中断请求 + */ + private boolean acquireLock(String key, long expire, long waitTime) throws InterruptedException { + //如果之前获取到了并且没有超时,则返回获取成功 + boolean acquired = acquired(key); + if (acquired) { + return true; + } + long acquireTime = waitTime == -1 ? -1 : waitTime * 1000 + System.currentTimeMillis(); + //同一个进程,对于同一个key锁,只允许先到的去尝试获取。 + // key.intern() 如果常量池中存在当前字符串, 就会直接返回当前字符串. + // 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回 + synchronized (key.intern()) { + String lockId = UUID.randomUUID().toString(); + do { + long before = System.currentTimeMillis(); + boolean hasLock = tryLock(key, expire, lockId); + //获取锁成功 + if (hasLock) { + long after = System.currentTimeMillis(); + Map map = lockMap.get(); + if (map == null) { + map = new HashMap<>(2); + lockMap.set(map); + } + map.put(key, new LockVO(1, lockId, expire * 1000 + before, expire * 1000 + after)); + log.debug("acquire lock {} {} ", key, 1); + return true; + } + Thread.sleep(DEFAULT_ACQUIRE_RESOLUTION_MILLIS); + } while (acquireTime == -1 || acquireTime > System.currentTimeMillis()); + } + log.debug("acquire lock {} fail,because timeout ", key); + return false; + } + + private boolean acquired(String key) { + Map map = lockMap.get(); + if (map == null || map.size() == 0 || !map.containsKey(key)) { + return false; + } + + LockVO vo = map.get(key); + if (vo.beforeExpireTime < System.currentTimeMillis()) { + log.debug("lock {} maybe release, because timeout ", key); + return false; + } + int after = ++vo.count; + log.debug("acquire lock {} {} ", key, after); + return true; + } + + /** + * 释放锁 + * + * @param key redis key + */ + private void release(String key) { + Map map = lockMap.get(); + if (map == null || map.size() == 0 || !map.containsKey(key)) { + return; + } + LockVO vo = map.get(key); + if (vo.afterExpireTime < System.currentTimeMillis()) { + log.debug("release lock {}, because timeout ", key); + map.remove(key); + return; + } + int after = --vo.count; + log.debug("release lock {} {} ", key, after); + if (after > 0) { + return; + } + map.remove(key); + RedisCallback callback = (connection) -> + connection.eval(UNLOCK_LUA.getBytes(StandardCharsets.UTF_8), ReturnType.BOOLEAN, 1, + (key).getBytes(StandardCharsets.UTF_8), vo.lockId.getBytes(StandardCharsets.UTF_8)); + redisTemplate.execute(callback); + } + + /** + * @param key 锁的key + * @param expire 锁的超时时间 秒 + * @param lockId 获取锁后,UUID生成的唯一ID + * @return if true success else fail + */ + private boolean tryLock(String key, long expire, String lockId) { + RedisCallback callback = (connection) -> + connection.set((key).getBytes(StandardCharsets.UTF_8), + lockId.getBytes(StandardCharsets.UTF_8), Expiration.seconds(expire), RedisStringCommands.SetOption.SET_IF_ABSENT); + return (Boolean) redisTemplate.execute(callback); + } + + private static class LockVO { + /** + * 锁重入的次数 + */ + private int count; + + /** + * 获取锁后,UUID生成的唯一ID + */ + private String lockId; + /** + * 获取锁之前的时间戳 + */ + private long beforeExpireTime; + /** + * 获取到锁的时间戳 + */ + private long afterExpireTime; + + LockVO(int count, String lockId, long beforeExpireTime, long afterExpireTime) { + this.count = count; + this.lockId = lockId; + this.beforeExpireTime = beforeExpireTime; + this.afterExpireTime = afterExpireTime; + } + } + +} + diff --git a/file-web/src/main/java/com/qiwenshare/file/advice/CMSException.java b/file-web/src/main/java/com/qiwenshare/file/advice/CMSException.java index f4f898d..76f68d3 100644 --- a/file-web/src/main/java/com/qiwenshare/file/advice/CMSException.java +++ b/file-web/src/main/java/com/qiwenshare/file/advice/CMSException.java @@ -1,6 +1,6 @@ package com.qiwenshare.file.advice; -import com.qiwenshare.common.cbb.ResultCodeEnum; +import com.qiwenshare.common.result.ResultCodeEnum; import lombok.Data; /** diff --git a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java index 9b526ea..159c90e 100644 --- a/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java +++ b/file-web/src/main/java/com/qiwenshare/file/advice/GlobalExceptionHandlerAdvice.java @@ -1,7 +1,7 @@ package com.qiwenshare.file.advice; -import com.qiwenshare.common.cbb.RestResult; -import com.qiwenshare.common.cbb.ResultCodeEnum; +import com.qiwenshare.common.result.RestResult; +import com.qiwenshare.common.result.ResultCodeEnum; import com.qiwenshare.common.exception.UploadGeneralException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.client.HttpClientErrorException; /** * 该注解为统一异常处理的核心 diff --git a/file-web/src/main/java/com/qiwenshare/file/aop/WebLogAcpect.java b/file-web/src/main/java/com/qiwenshare/file/aop/WebLogAcpect.java index db2ce2d..4f8de71 100644 --- a/file-web/src/main/java/com/qiwenshare/file/aop/WebLogAcpect.java +++ b/file-web/src/main/java/com/qiwenshare/file/aop/WebLogAcpect.java @@ -1,6 +1,6 @@ package com.qiwenshare.file.aop; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IOperationLogService; import com.qiwenshare.file.api.IUserService; diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IFileService.java b/file-web/src/main/java/com/qiwenshare/file/api/IFileService.java index 23fe23b..3ef2ab9 100644 --- a/file-web/src/main/java/com/qiwenshare/file/api/IFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/api/IFileService.java @@ -19,7 +19,7 @@ public interface IFileService extends IService { // List selectFileListByPath(FileBean fileBean); - void deleteLocalFile(FileBean fileBean); +// void deleteLocalFile(FileBean fileBean); diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java index 61bee29..a9b37dc 100644 --- a/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/api/IFiletransferService.java @@ -1,5 +1,6 @@ package com.qiwenshare.file.api; +import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO; @@ -21,7 +22,7 @@ public interface IFiletransferService { void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId); void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO); - + void deleteFile(FileBean fileBean); StorageBean selectStorageBean(StorageBean storageBean); void insertStorageBean(StorageBean storageBean); diff --git a/file-web/src/main/java/com/qiwenshare/file/api/IUserService.java b/file-web/src/main/java/com/qiwenshare/file/api/IUserService.java index 9cec3f8..a575b6f 100644 --- a/file-web/src/main/java/com/qiwenshare/file/api/IUserService.java +++ b/file-web/src/main/java/com/qiwenshare/file/api/IUserService.java @@ -1,11 +1,9 @@ package com.qiwenshare.file.api; import com.baomidou.mybatisplus.extension.service.IService; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.file.domain.UserBean; -import java.util.List; - public interface IUserService extends IService { UserBean getUserBeanByToken(String token); diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java index 71b3a8f..335b3c9 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FileController.java @@ -1,12 +1,16 @@ package com.qiwenshare.file.controller; import com.alibaba.fastjson.JSON; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.CopyObjectResult; +import com.aliyun.oss.model.ObjectMetadata; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.qiwenshare.common.cbb.DateUtil; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.DateUtil; +import com.qiwenshare.common.result.RestResult; +import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.operation.FileOperation; -import com.qiwenshare.common.oss.AliyunOSSRename; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.anno.MyLog; @@ -168,7 +172,7 @@ public class FileController { String fileUrl = file.getFileUrl(); String newFileUrl = fileUrl.replace(userFile.getFileName(), renameFileDto.getFileName()); - AliyunOSSRename.rename(qiwenFileConfig.getAliyun().getOss(), + rename(qiwenFileConfig.getAliyun().getOss(), fileUrl.substring(1), newFileUrl.substring(1)); LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); @@ -196,6 +200,27 @@ public class FileController { return RestResult.success(); } + private void rename(AliyunOSS aliyunOSS, String sourceObjectName, String destinationObjectName) { + String endpoint = aliyunOSS.getEndpoint(); + String accessKeyId = aliyunOSS.getAccessKeyId(); + String accessKeySecret = aliyunOSS.getAccessKeySecret(); + String bucketName = aliyunOSS.getBucketName(); + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + CopyObjectResult result = ossClient.copyObject(bucketName, sourceObjectName, bucketName, destinationObjectName); + + ossClient.deleteObject(bucketName, sourceObjectName); + ObjectMetadata metadata = new ObjectMetadata(); +// if ("pdf".equals(FileUtil.getFileType(objectName))) { +// metadata.setContentDisposition("attachment"); +// } + +// ossClient.putObject(bucketName, objectName, inputStream, metadata); + + + // 关闭OSSClient。 + ossClient.shutdown(); + } + @Operation(summary = "获取文件列表", description = "用来做前台列表展示", tags = {"file"}) @RequestMapping(value = "/getfilelist", method = RequestMethod.GET) diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index 799c59e..1c5e573 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -1,14 +1,11 @@ package com.qiwenshare.file.controller; -import com.aliyun.oss.OSS; -import com.aliyun.oss.model.OSSObject; import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; -import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.common.operation.FileOperation; -import com.qiwenshare.common.oss.AliyunOSSDownload; import com.qiwenshare.common.util.FileUtil; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IFileService; @@ -179,35 +176,7 @@ public class FiletransferController { } } - private void aliyunDownload(HttpServletResponse response, FileBean fileBean) { - BufferedInputStream bis = null; - byte[] buffer = new byte[1024]; - AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); - OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); - OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); - InputStream inputStream = ossObject.getObjectContent(); - try { - bis = new BufferedInputStream(inputStream); - OutputStream os = response.getOutputStream(); - int i = bis.read(buffer); - while (i != -1) { - os.write(buffer, 0, i); - i = bis.read(buffer); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (bis != null) { - try { - bis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - ossClient.shutdown(); - } public void fastFDSDownload(HttpServletResponse response, FileBean fileBean){ diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/RecoveryFileController.java b/file-web/src/main/java/com/qiwenshare/file/controller/RecoveryFileController.java index 2b8d31e..e5b3d63 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/RecoveryFileController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/RecoveryFileController.java @@ -3,8 +3,8 @@ package com.qiwenshare.file.controller; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.qiwenshare.common.cbb.DateUtil; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.DateUtil; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IRecoveryFileService; diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java b/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java index 53e4762..00e611f 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/ShareController.java @@ -4,8 +4,8 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.qiwenshare.common.cbb.DateUtil; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.DateUtil; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IShareService; import com.qiwenshare.file.api.IUserService; diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java index 8c520d3..26a79c4 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/TaskController.java @@ -8,6 +8,7 @@ import com.qiwenshare.file.config.es.FileSearch; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.service.FileService; +import com.qiwenshare.file.service.FiletransferService; import com.qiwenshare.file.service.UserFileService; import com.qiwenshare.file.service.UserService; import com.qiwenshare.file.vo.file.FileListVo; @@ -30,6 +31,8 @@ public class TaskController { FileService fileService; @Resource UserFileService userFileService; + @Resource + FiletransferService filetransferService; @Autowired private IElasticSearchService elasticSearchService; @@ -43,7 +46,7 @@ public class TaskController { for (int i = 0; i < fileBeanList.size(); i++) { FileBean fileBean = fileBeanList.get(i); log.info("删除本地文件:" + JSON.toJSONString(fileBean)); - fileService.deleteLocalFile(fileBean); + filetransferService.deleteFile(fileBean); fileService.removeById(fileBean.getFileId()); } diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java index 953d2b2..9674e66 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/UserController.java @@ -2,7 +2,7 @@ package com.qiwenshare.file.controller; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.domain.AliyunOSS; import com.qiwenshare.common.util.JjwtUtil; import com.qiwenshare.file.anno.MyLog; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java index 281771a..2f70c77 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FileService.java @@ -1,12 +1,7 @@ package com.qiwenshare.file.service; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.tobato.fastdfs.service.FastFileStorageClient; -import com.qiwenshare.common.operation.FileOperation; -import com.qiwenshare.common.oss.AliyunOSSDelete; -import com.qiwenshare.common.util.FileUtil; -import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.api.IFileService; import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; @@ -82,31 +77,31 @@ public class FileService extends ServiceImpl implements IF // .orderByDesc(FileBean::getIsDir); // return fileMapper.selectList(lambdaQueryWrapper); // } - @Override - public void deleteLocalFile(FileBean fileBean) { - log.info("删除本地文件:" + JSON.toJSONString(fileBean)); - //删除服务器文件 - if (fileBean.getFileUrl() != null && fileBean.getFileUrl().indexOf("upload") != -1){ - if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { - AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); - } else if (fileBean.getStorageType() == 0) { - FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); - if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { - FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); - } - } else if (fileBean.getStorageType() == 1) { - AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); - } else if (fileBean.getStorageType() == 2){ - fastFileStorageClient.deleteFile(fileBean.getFileUrl()); - - } else { - FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); - if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { - FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); - } - } - } - } +// @Override +// public void deleteLocalFile(FileBean fileBean) { +// log.info("删除本地文件:" + JSON.toJSONString(fileBean)); +// //删除服务器文件 +// if (fileBean.getFileUrl() != null && fileBean.getFileUrl().indexOf("upload") != -1){ +// if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { +// AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); +// } else if (fileBean.getStorageType() == 0) { +// FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); +// if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { +// FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); +// } +// } else if (fileBean.getStorageType() == 1) { +// AliyunOSSDelete.deleteObject(qiwenFileConfig.getAliyun().getOss(), fileBean.getFileUrl().substring(1)); +// } else if (fileBean.getStorageType() == 2){ +// fastFileStorageClient.deleteFile(fileBean.getFileUrl()); +// +// } else { +// FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); +// if (FileUtil.isImageFile(FileUtil.getFileExtendName(fileBean.getFileUrl()))) { +// FileOperation.deleteFile(PathUtil.getStaticPath() + fileBean.getFileUrl().replace(fileBean.getTimeStampName(), fileBean.getTimeStampName() + "_min")); +// } +// } +// } +// } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index 321dac7..2aa8806 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -10,13 +10,15 @@ import javax.servlet.http.HttpServletResponse; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.DateUtil; +import com.qiwenshare.common.domain.DeleteFile; import com.qiwenshare.common.domain.DownloadFile; import com.qiwenshare.common.domain.UploadFile; //import com.qiwenshare.common.factory.FileOperationFactory; -import com.qiwenshare.common.download.Downloader; +import com.qiwenshare.common.operation.delete.Deleter; +import com.qiwenshare.common.operation.download.Downloader; import com.qiwenshare.common.factory.FileOperationFactory; -import com.qiwenshare.common.upload.Uploader; +import com.qiwenshare.common.operation.upload.Uploader; import com.qiwenshare.file.api.IFiletransferService; @@ -148,6 +150,24 @@ public class FiletransferService implements IFiletransferService { downloader.download(httpServletResponse, uploadFile); } + @Override + public void deleteFile(FileBean fileBean) { + Deleter deleter = null; + if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { + deleter = aliyunOSSOperationFactory.getDeleter(); + } else if (fileBean.getStorageType() == 0) { + deleter = localStorageOperationFactory.getDeleter(); + } else if (fileBean.getStorageType() == 1) { + deleter = aliyunOSSOperationFactory.getDeleter(); + } else if (fileBean.getStorageType() == 2) { + deleter = fastDFSOperationFactory.getDeleter(); + } + DeleteFile deleteFile = new DeleteFile(); + deleteFile.setFileUrl(fileBean.getFileUrl()); + deleteFile.setTimeStampName(fileBean.getTimeStampName()); + deleter.delete(deleteFile); + } + @Override public StorageBean selectStorageBean(StorageBean storageBean) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); diff --git a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java index 859c7b8..b649db7 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java @@ -4,12 +4,11 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.api.IRecoveryFileService; import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.RecoveryFile; -import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.mapper.RecoveryFileMapper; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java index a33a857..19e494b 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/UserFileService.java @@ -3,7 +3,7 @@ package com.qiwenshare.file.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.file.api.IUserFileService; import com.qiwenshare.common.config.QiwenFileConfig; import com.qiwenshare.file.domain.FileBean; diff --git a/file-web/src/main/java/com/qiwenshare/file/service/UserService.java b/file-web/src/main/java/com/qiwenshare/file/service/UserService.java index b88d36a..5ff2b79 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/UserService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/UserService.java @@ -3,8 +3,8 @@ package com.qiwenshare.file.service; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.qiwenshare.common.cbb.DateUtil; -import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.DateUtil; +import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.util.JjwtUtil; import com.qiwenshare.common.util.PasswordUtil; import com.qiwenshare.file.api.IUserService; @@ -15,8 +15,6 @@ import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.crypto.hash.SimpleHash; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/file-web/src/main/java/com/qiwenshare/file/util/OperationLogUtil.java b/file-web/src/main/java/com/qiwenshare/file/util/OperationLogUtil.java index ebc6dcb..4b90f0c 100644 --- a/file-web/src/main/java/com/qiwenshare/file/util/OperationLogUtil.java +++ b/file-web/src/main/java/com/qiwenshare/file/util/OperationLogUtil.java @@ -1,10 +1,9 @@ package com.qiwenshare.file.util; -import com.qiwenshare.common.cbb.CollectUtil; -import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.util.CollectUtil; +import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.file.domain.OperationLogBean; import com.qiwenshare.file.domain.UserBean; -import org.apache.shiro.SecurityUtils; import javax.servlet.http.HttpServletRequest; diff --git a/file-web/src/main/resources/config/application.properties b/file-web/src/main/resources/config/application.properties index 8522145..1f6ca74 100644 --- a/file-web/src/main/resources/config/application.properties +++ b/file-web/src/main/resources/config/application.properties @@ -49,10 +49,10 @@ mybatis-plus.mapper-locations=classpath:mybatis/mapper/*.xml mybatis-plus.configuration.map-underscore-to-camel-case=false mybatis-plus.global-config.banner=false -qiwen-file.remote-login=false qiwen-file.share-mode=false qiwen-file.storage-type=0 +qiwen-file.cache-mode=0 #是否启用阿里云oss #qiwen-file.aliyun.oss.enabled=false From de37f5d6533300e2b5561be420fc83f7f408cbde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Wed, 24 Mar 2021 22:51:35 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3105661..4ae8850 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@

- 基于springboot + vue 框架开发的Web文件系统,旨在为用户提供一个简单、方便的文件存储方案,能够以完善的目录结构体系,对文件进行管理 。 + 基于Spring Boot + VUE CLI@3 框架开发的分布式文件系统,旨在为用户和企业提供一个简单、方便的文件存储方案,能够以完善的目录结构体系,对文件进行管理 。

@@ -15,7 +15,6 @@ gitee star -

在线演示环境  | @@ -42,13 +41,20 @@ 3. 支持对zip文件和rar文件的在线解压缩 4. 支持文件和目录的移动和复制 5. 多文件格式分类查看 -6. 支持阿里云OSS对象存储 -7. 增加分片上传,该功能同时支持本地存储和阿里云OSS +6. 支持阿里云OSS对象存储,FastDFS存储 +7. 增加分片上传,该功能同时支持本地存储和阿里云OSS,FastDFS 8. 支持极速秒传功能,提高上传效率 9. 上传文件前台实时显示上传文件进度,上传速率,百分比等信息 10. 支持文件重命名 11. 可实时显示文件存储占用情况及总占用容量 -12. ... +12. 支持ElasticSearch文件搜索 +13. ... + +## 项目代码地址 +|系统|地址| +|-|-| +|奇文网盘前台|[https://gitee.com/qiwen-cloud/qiwen-file-web](https://gitee.com/qiwen-cloud/qiwen-file-web)| +|奇文网盘后台|[https://gitee.com/qiwen-cloud/qiwen-file](https://gitee.com/qiwen-cloud/qiwen-file)| ## 软件架构 该项目采用前后端分离的方式进行开发和部署,主要用到以下关键技术 From 693e63ca0a848401d89015b33f129287ef62c2be Mon Sep 17 00:00:00 2001 From: MAC <1162714483@qq.com> Date: Wed, 24 Mar 2021 22:55:42 +0800 Subject: [PATCH 14/14] update README.md. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4ae8850..65cf692 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,10 @@ |奇文网盘前台|[https://gitee.com/qiwen-cloud/qiwen-file-web](https://gitee.com/qiwen-cloud/qiwen-file-web)| |奇文网盘后台|[https://gitee.com/qiwen-cloud/qiwen-file](https://gitee.com/qiwen-cloud/qiwen-file)| +## 网络拓扑图 + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0324/225520_d55b109e_947714.png "屏幕截图.png") + ## 软件架构 该项目采用前后端分离的方式进行开发和部署,主要用到以下关键技术