From 1535ad48aa99c0c4ed2fa5470a81d38a73f0bbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Tue, 13 Apr 2021 21:37:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=A2=84=E8=A7=88=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- file-common/pom.xml | 10 +- .../common/operation/FileOperation.java | 41 +++- .../upload/product/AliyunOSSUploader.java | 3 +- .../upload/product/FastDFSUploader.java | 6 +- .../upload/product/LocalStorageUploader.java | 3 +- .../com/qiwenshare/common/util/MimeUtils.java | 201 ++++++++++++++++++ .../com/qiwenshare/common/util/PathUtil.java | 15 +- .../controller/FiletransferController.java | 20 +- .../file/service/FiletransferService.java | 2 +- 9 files changed, 266 insertions(+), 35 deletions(-) create mode 100644 file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java diff --git a/file-common/pom.xml b/file-common/pom.xml index 62f959d..9bb3eda 100644 --- a/file-common/pom.xml +++ b/file-common/pom.xml @@ -20,11 +20,11 @@ 7.4.0 - - commons-fileupload - commons-fileupload - 1.3.3 - + + + + + 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 699608d..f508b12 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 @@ -256,16 +256,37 @@ public class FileOperation { } targetFile.createNewFile(); // 将压缩文件内容写入到这个文件中 - InputStream is = zipFile.getInputStream(entry); - FileOutputStream fos = new FileOutputStream(targetFile); - int len; - byte[] buf = new byte[2048]; - while ((len = is.read(buf)) != -1) { - fos.write(buf, 0, len); + InputStream is = null; + FileOutputStream fos = null; + try { + is = zipFile.getInputStream(entry); + fos = new FileOutputStream(targetFile); + int len; + byte[] buf = new byte[2048]; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + } + } catch (Exception e) { + // 关流顺序,先打开的后关闭 + if (fos != null) { + try { + fos.close(); + } catch (Exception e1) { + log.error("关闭流失败:" + e1); + } + + } + if (is != null) { + try { + is.close(); + } catch (Exception e2) { + log.error("关闭流失败:" + e2); + } + + } + } - // 关流顺序,先打开的后关闭 - fos.close(); - is.close(); + } } } catch (Exception e) { @@ -297,7 +318,7 @@ public class FileOperation { /** * 解压rar * - * @param sourceFile 需要解压的文件 + * @param sourceFile 需要解压的文件 * @param destDirPath 目的路径 * @throws Exception */ diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java index 7d6ff6d..54a5690 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/AliyunOSSUploader.java @@ -12,7 +12,8 @@ import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.util.PathUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.fileupload.servlet.ServletFileUpload; +//import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java index 9677a3b..77227d8 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/FastDFSUploader.java @@ -8,8 +8,10 @@ import com.qiwenshare.common.operation.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.apache.commons.fileupload.disk.DiskFileItemFactory; +//import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; +import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java index d9d25b2..aab6d6d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/upload/product/LocalStorageUploader.java @@ -8,8 +8,9 @@ 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; -import org.apache.commons.fileupload.servlet.ServletFileUpload; +//import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.lang3.StringUtils; +import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java b/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java new file mode 100644 index 0000000..4b02c0c --- /dev/null +++ b/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java @@ -0,0 +1,201 @@ +package com.qiwenshare.common.util; + +import java.util.HashMap; +import java.util.Map; + +public class MimeUtils { + + public static String getMime(String suffix){ + return map.get(suffix); + } + private static Map map=new HashMap(); + static{ + map.put("323","text/h323"); + map.put("acx","application/internet-property-stream"); + map.put("ai","application/postscript"); + map.put("aif","audio/x-aiff"); + map.put("aifc","audio/x-aiff"); + map.put("aiff","audio/x-aiff"); + map.put("asf","video/x-ms-asf"); + map.put("asr","video/x-ms-asf"); + map.put("asx","video/x-ms-asf"); + map.put("au","audio/basic"); + map.put("avi","video/x-msvideo"); + map.put("axs","application/olescript"); + map.put("bas","text/plain"); + map.put("bcpio","application/x-bcpio"); + map.put("bin","application/octet-stream"); + map.put("bmp","image/bmp"); + map.put("c","text/plain"); + map.put("cat","application/vnd.ms-pkiseccat"); + map.put("cdf","application/x-cdf"); + map.put("cer","application/x-x509-ca-cert"); + map.put("class","application/octet-stream"); + map.put("clp","application/x-msclip"); + map.put("cmx","image/x-cmx"); + map.put("cod","image/cis-cod"); + map.put("cpio","application/x-cpio"); + map.put("crd","application/x-mscardfile"); + map.put("crl","application/pkix-crl"); + map.put("crt","application/x-x509-ca-cert"); + map.put("csh","application/x-csh"); + map.put("css","text/css"); + map.put("dcr","application/x-director"); + map.put("der","application/x-x509-ca-cert"); + map.put("dir","application/x-director"); + map.put("dll","application/x-msdownload"); + map.put("dms","application/octet-stream"); + map.put("doc","application/msword"); + map.put("dot","application/msword"); + map.put("dvi","application/x-dvi"); + map.put("dxr","application/x-director"); + map.put("eps","application/postscript"); + map.put("etx","text/x-setext"); + map.put("evy","application/envoy"); + map.put("exe","application/octet-stream"); + map.put("fif","application/fractals"); + map.put("flr","x-world/x-vrml"); + map.put("gif","image/gif"); + map.put("gtar","application/x-gtar"); + map.put("gz","application/x-gzip"); + map.put("h","text/plain"); + map.put("hdf","application/x-hdf"); + map.put("hlp","application/winhlp"); + map.put("hqx","application/mac-binhex40"); + map.put("hta","application/hta"); + map.put("htc","text/x-component"); + map.put("htm","text/html"); + map.put("html","text/html"); + map.put("htt","text/webviewhtml"); + map.put("ico","image/x-icon"); + map.put("ief","image/ief"); + map.put("iii","application/x-iphone"); + map.put("ins","application/x-internet-signup"); + map.put("isp","application/x-internet-signup"); + map.put("jfif","image/pipeg"); + map.put("jpe","image/jpeg"); + map.put("jpeg","image/jpeg"); + map.put("jpg","image/jpeg"); + map.put("js","application/x-javascript"); + map.put("latex","application/x-latex"); + map.put("lha","application/octet-stream"); + map.put("lsf","video/x-la-asf"); + map.put("lsx","video/x-la-asf"); + map.put("lzh","application/octet-stream"); + map.put("m13","application/x-msmediaview"); + map.put("m14","application/x-msmediaview"); + map.put("m3u","audio/x-mpegurl"); + map.put("man","application/x-troff-man"); + map.put("mdb","application/x-msaccess"); + map.put("me","application/x-troff-me"); + map.put("mht","message/rfc822"); + map.put("mhtml","message/rfc822"); + map.put("mid","audio/mid"); + map.put("mny","application/x-msmoney"); + map.put("mov","video/quicktime"); + map.put("movie","video/x-sgi-movie"); + map.put("mp2","video/mpeg"); + map.put("mp3","audio/mpeg"); + map.put("mpa","video/mpeg"); + map.put("mpe","video/mpeg"); + map.put("mpeg","video/mpeg"); + map.put("mpg","video/mpeg"); + map.put("mpp","application/vnd.ms-project"); + map.put("mpv2","video/mpeg"); + map.put("ms","application/x-troff-ms"); + map.put("mvb","application/x-msmediaview"); + map.put("nws","message/rfc822"); + map.put("oda","application/oda"); + map.put("p10","application/pkcs10"); + map.put("p12","application/x-pkcs12"); + map.put("p7b","application/x-pkcs7-certificates"); + map.put("p7c","application/x-pkcs7-mime"); + map.put("p7m","application/x-pkcs7-mime"); + map.put("p7r","application/x-pkcs7-certreqresp"); + map.put("p7s","application/x-pkcs7-signature"); + map.put("pbm","image/x-portable-bitmap"); + map.put("pdf","application/pdf"); + map.put("pfx","application/x-pkcs12"); + map.put("pgm","image/x-portable-graymap"); + map.put("pko","application/ynd.ms-pkipko"); + map.put("pma","application/x-perfmon"); + map.put("pmc","application/x-perfmon"); + map.put("pml","application/x-perfmon"); + map.put("pmr","application/x-perfmon"); + map.put("pmw","application/x-perfmon"); + map.put("pnm","image/x-portable-anymap"); + map.put("pot,","application/vnd.ms-powerpoint"); + map.put("ppm","image/x-portable-pixmap"); + map.put("pps","application/vnd.ms-powerpoint"); + map.put("ppt","application/vnd.ms-powerpoint"); + map.put("prf","application/pics-rules"); + map.put("ps","application/postscript"); + map.put("pub","application/x-mspublisher"); + map.put("qt","video/quicktime"); + map.put("ra","audio/x-pn-realaudio"); + map.put("ram","audio/x-pn-realaudio"); + map.put("ras","image/x-cmu-raster"); + map.put("rgb","image/x-rgb"); + map.put("rmi","audio/mid"); + map.put("roff","application/x-troff"); + map.put("rtf","application/rtf"); + map.put("rtx","text/richtext"); + map.put("scd","application/x-msschedule"); + map.put("sct","text/scriptlet"); + map.put("setpay","application/set-payment-initiation"); + map.put("setreg","application/set-registration-initiation"); + map.put("sh","application/x-sh"); + map.put("shar","application/x-shar"); + map.put("sit","application/x-stuffit"); + map.put("snd","audio/basic"); + map.put("spc","application/x-pkcs7-certificates"); + map.put("spl","application/futuresplash"); + map.put("src","application/x-wais-source"); + map.put("sst","application/vnd.ms-pkicertstore"); + map.put("stl","application/vnd.ms-pkistl"); + map.put("stm","text/html"); + map.put("svg","image/svg+xml"); + map.put("sv4cpio","application/x-sv4cpio"); + map.put("sv4crc","application/x-sv4crc"); + map.put("swf","application/x-shockwave-flash"); + map.put("t","application/x-troff"); + map.put("tar","application/x-tar"); + map.put("tcl","application/x-tcl"); + map.put("tex","application/x-tex"); + map.put("texi","application/x-texinfo"); + map.put("texinfo","application/x-texinfo"); + map.put("tgz","application/x-compressed"); + map.put("tif","image/tiff"); + map.put("tiff","image/tiff"); + map.put("tr","application/x-troff"); + map.put("trm","application/x-msterminal"); + map.put("tsv","text/tab-separated-values"); + map.put("txt","text/plain"); + map.put("uls","text/iuls"); + map.put("ustar","application/x-ustar"); + map.put("vcf","text/x-vcard"); + map.put("vrml","x-world/x-vrml"); + map.put("wav","audio/x-wav"); + map.put("wcm","application/vnd.ms-works"); + map.put("wdb","application/vnd.ms-works"); + map.put("wks","application/vnd.ms-works"); + map.put("wmf","application/x-msmetafile"); + map.put("wps","application/vnd.ms-works"); + map.put("wri","application/x-mswrite"); + map.put("wrl","x-world/x-vrml"); + map.put("wrz","x-world/x-vrml"); + map.put("xaf","x-world/x-vrml"); + map.put("xbm","image/x-xbitmap"); + map.put("xla","application/vnd.ms-excel"); + map.put("xlc","application/vnd.ms-excel"); + map.put("xlm","application/vnd.ms-excel"); + map.put("xls","application/vnd.ms-excel"); + map.put("xlt","application/vnd.ms-excel"); + map.put("xlw","application/vnd.ms-excel"); + map.put("xof","x-world/x-vrml"); + map.put("xpm","image/x-xpixmap"); + map.put("xwd","image/x-xwindowdump"); + map.put("z","application/x-compress"); + map.put("zip","application/zip"); + } +} diff --git a/file-common/src/main/java/com/qiwenshare/common/util/PathUtil.java b/file-common/src/main/java/com/qiwenshare/common/util/PathUtil.java index 4702afb..2476759 100644 --- a/file-common/src/main/java/com/qiwenshare/common/util/PathUtil.java +++ b/file-common/src/main/java/com/qiwenshare/common/util/PathUtil.java @@ -1,6 +1,7 @@ package com.qiwenshare.common.util; import com.qiwenshare.common.config.PropertiesUtil; +import com.qiwenshare.common.constant.FileConstant; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ResourceUtils; @@ -66,21 +67,9 @@ public class PathUtil { } - /** - * 获取文件扩展名 - * - * @return string - */ - private static String getFileExt(String fileName) { - if (fileName.lastIndexOf(".") == -1) { - return ".png"; - //这里暂时用jpg,后续应该去获取真实的文件类型 - } - return fileName.substring(fileName.lastIndexOf(".")); - } public static String getParentPath(String path) { - return path.substring(0, path.lastIndexOf("/")); + return path.substring(0, path.lastIndexOf(FileConstant.pathSeparator)); } 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 0824fc3..9e191a7 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 @@ -5,6 +5,7 @@ import com.qiwenshare.common.exception.NotLoginException; import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.util.DateUtil; import com.qiwenshare.common.util.FileUtil; +import com.qiwenshare.common.util.MimeUtils; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.api.IFiletransferService; @@ -17,9 +18,13 @@ 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.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -131,10 +136,21 @@ public class FiletransferController { @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"}) @MyLog(operation = "下载文件", module = CURRENT_MODULE) @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) - public void downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { - filetransferService.downloadFile(response, downloadFileDTO); + public void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) { + httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 + filetransferService.downloadFile(httpServletResponse, downloadFileDTO); } + @Operation(summary="预览文件", description="用于文件预览", tags = {"filetransfer"}) + @GetMapping("/preview") + public void preview(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO){ + + UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); + String mime= MimeUtils.getMime(userFile.getExtendName()); + httpServletResponse.setContentType(mime); + filetransferService.downloadFile(httpServletResponse, downloadFileDTO); + + } @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"}) @RequestMapping(value = "/getstorage", method = RequestMethod.GET) 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 8dd250d..55cf1ca 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 @@ -136,7 +136,7 @@ public class FiletransferService implements IFiletransferService { } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 + httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 From e0d874706aa30fa30165e4b12ecfdf0ca4056ef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E8=B6=85?= <1162714483@qq.com> Date: Thu, 15 Apr 2021 23:58:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/operation/download/Downloader.java | 2 + .../download/product/AliyunOSSDownloader.java | 9 ++ .../download/product/FastDFSDownloader.java | 16 ++- .../product/LocalStorageDownloader.java | 14 ++ .../com/qiwenshare/common/util/MimeUtils.java | 5 +- .../controller/FiletransferController.java | 48 ++++++- .../qiwenshare/file/dto/file/PreviewDTO.java | 10 ++ .../file/service/FiletransferService.java | 125 ++++++++++++++---- pom.xml | 20 --- 9 files changed, 192 insertions(+), 57 deletions(-) create mode 100644 file-web/src/main/java/com/qiwenshare/file/dto/file/PreviewDTO.java diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java index ab67fa8..61bf66d 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/Downloader.java @@ -3,7 +3,9 @@ package com.qiwenshare.common.operation.download; import com.qiwenshare.common.operation.download.domain.DownloadFile; import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; public abstract class Downloader { public abstract void download(HttpServletResponse httpServletResponse, DownloadFile uploadFile); + public abstract InputStream getInputStream(DownloadFile downloadFile); } diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java index 3284ad8..c5c430c 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/AliyunOSSDownloader.java @@ -53,6 +53,15 @@ public class AliyunOSSDownloader extends Downloader { ossClient.shutdown(); } + @Override + public InputStream getInputStream(DownloadFile downloadFile) { + OSS ossClient = createOSSClient(qiwenFileConfig.getAliyun().getOss()); + OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), + downloadFile.getFileUrl().substring(1)); + InputStream inputStream = ossObject.getObjectContent(); + return inputStream; + } + public OSS createOSSClient(AliyunOSS aliyunOSS) { String endpoint = aliyunOSS.getEndpoint(); String accessKeyId = aliyunOSS.getAccessKeyId(); diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java index 37afcc7..19e6c3e 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/FastDFSDownloader.java @@ -4,12 +4,15 @@ import com.github.tobato.fastdfs.proto.storage.DownloadByteArray; import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.qiwenshare.common.operation.download.domain.DownloadFile; import com.qiwenshare.common.operation.download.Downloader; +import com.sun.xml.internal.messaging.saaj.util.ByteInputStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; @Component public class FastDFSDownloader extends Downloader { @@ -22,9 +25,6 @@ public class FastDFSDownloader extends Downloader { 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(); @@ -42,4 +42,14 @@ public class FastDFSDownloader extends Downloader { } } } + + @Override + public InputStream getInputStream(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); + InputStream inputStream = new ByteArrayInputStream(bytes); + return inputStream; + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java index f424c9d..f08f855 100644 --- a/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java +++ b/file-common/src/main/java/com/qiwenshare/common/operation/download/product/LocalStorageDownloader.java @@ -45,4 +45,18 @@ public class LocalStorageDownloader extends Downloader { } } } + + @Override + public InputStream getInputStream(DownloadFile downloadFile) { + //设置文件路径 + File file = FileOperation.newFile(PathUtil.getStaticPath() + downloadFile.getFileUrl()); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return inputStream; + + } } diff --git a/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java b/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java index 4b02c0c..6ca33df 100644 --- a/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java +++ b/file-common/src/main/java/com/qiwenshare/common/util/MimeUtils.java @@ -64,8 +64,8 @@ public class MimeUtils { map.put("hqx","application/mac-binhex40"); map.put("hta","application/hta"); map.put("htc","text/x-component"); - map.put("htm","text/html"); - map.put("html","text/html"); + map.put("htm","text/plain"); + map.put("html","text/plain"); map.put("htt","text/webviewhtml"); map.put("ico","image/x-icon"); map.put("ief","image/ief"); @@ -96,6 +96,7 @@ public class MimeUtils { map.put("movie","video/x-sgi-movie"); map.put("mp2","video/mpeg"); map.put("mp3","audio/mpeg"); + map.put("mp4","video/mp4"); map.put("mpa","video/mpeg"); map.put("mpe","video/mpeg"); map.put("mpeg","video/mpeg"); 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 9e191a7..0a24514 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 @@ -17,23 +17,27 @@ 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.dto.file.PreviewDTO; import com.qiwenshare.file.vo.file.UploadFileVo; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.List; import java.util.Map; +@Slf4j @Tag(name = "filetransfer", description = "该接口为文件传输接口,主要用来做文件的上传和下载") @RestController @RequestMapping("/filetransfer") @@ -138,17 +142,51 @@ public class FiletransferController { @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) public void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) { httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 + 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(); + } + + httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 filetransferService.downloadFile(httpServletResponse, downloadFileDTO); } @Operation(summary="预览文件", description="用于文件预览", tags = {"filetransfer"}) @GetMapping("/preview") - public void preview(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO){ + public void preview(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, PreviewDTO previewDTO){ - UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); + UserFile userFile = userFileService.getById(previewDTO.getUserFileId()); + FileBean fileBean = fileService.getById(userFile.getFileId()); String mime= MimeUtils.getMime(userFile.getExtendName()); - httpServletResponse.setContentType(mime); - filetransferService.downloadFile(httpServletResponse, downloadFileDTO); +// httpServletResponse.setContentType(mime); + httpServletResponse.setHeader("Content-Type", mime); + String rangeString = httpServletRequest.getHeader("Range");//如果是video标签发起的请求就不会为null + if (StringUtils.isNotEmpty(rangeString)) { + long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); + httpServletResponse.setContentLength(Math.toIntExact(fileBean.getFileSize())); + httpServletResponse.setHeader("Content-Range", String.valueOf(range + (Math.toIntExact(fileBean.getFileSize()) - 1))); + } + httpServletResponse.setHeader("Accept-Ranges", "bytes"); + + String fileName = userFile.getFileName() + "." + userFile.getExtendName(); + try { + fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + httpServletResponse.addHeader("Content-Disposition", "fileName=" + fileName);// 设置文件名 + DownloadFileDTO downloadFileDTO = new DownloadFileDTO(); + downloadFileDTO.setUserFileId(previewDTO.getUserFileId()); + try { + filetransferService.downloadFile(httpServletResponse, downloadFileDTO); + }catch (Exception e){ + //org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 + log.error("该异常忽略不做处理"); + } } diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/file/PreviewDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/file/PreviewDTO.java new file mode 100644 index 0000000..529dfa3 --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/dto/file/PreviewDTO.java @@ -0,0 +1,10 @@ +package com.qiwenshare.file.dto.file; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "预览文件DTO",required = true) +public class PreviewDTO { + 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 55cf1ca..e492643 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,7 +1,11 @@ package com.qiwenshare.file.service; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.util.List; +import java.util.zip.Adler32; +import java.util.zip.CheckedOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -20,6 +24,7 @@ import com.qiwenshare.common.operation.download.Downloader; import com.qiwenshare.common.factory.FileOperationFactory; import com.qiwenshare.common.operation.upload.Uploader; +import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.api.IFiletransferService; import com.qiwenshare.common.config.QiwenFileConfig; @@ -130,35 +135,101 @@ public class FiletransferService implements IFiletransferService { 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.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 + if (userFile.getIsDir() == 0) { - 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(); - } - if (downloader == null) { - log.error("下载失败,文件存储类型不支持下载,storageType:{}, isOSS:{}", fileBean.getStorageType(), fileBean.getIsOSS()); - throw new UploadGeneralException("下载失败"); - } - DownloadFile uploadFile = new DownloadFile(); - uploadFile.setFileUrl(fileBean.getFileUrl()); + + 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(); + } + if (downloader == null) { + log.error("下载失败,文件存储类型不支持下载,storageType:{}, isOSS:{}", fileBean.getStorageType(), fileBean.getIsOSS()); + throw new UploadGeneralException("下载失败"); + } + DownloadFile uploadFile = new DownloadFile(); + uploadFile.setFileUrl(fileBean.getFileUrl()); // uploadFile.setTimeStampName(fileBean.getTimeStampName()); - downloader.download(httpServletResponse, uploadFile); + downloader.download(httpServletResponse, uploadFile); + } else { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.likeRight(UserFile::getFilePath, userFile.getFilePath()) + .eq(UserFile::getUserId, userFile.getUserId()) + .eq(UserFile::getIsDir, 0) + .eq(UserFile::getDeleteFlag, 0); + List userFileList = userFileMapper.selectList(lambdaQueryWrapper); + + String staticPath = PathUtil.getStaticPath(); + String tempPath = staticPath + "temp" + File.separator; + File tempFile = new File(tempPath); + if (!tempFile.exists()) { + tempFile.mkdirs(); + } + + FileOutputStream f = null; + try { + f = new FileOutputStream(tempPath + userFile.getFileName() + ".zip"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32()); + ZipOutputStream zos = new ZipOutputStream(csum); + BufferedOutputStream out = new BufferedOutputStream(zos); + + zos.setComment("A test of Java Zipping"); + for (UserFile userFile1 : userFileList) { + 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(); + } + if (downloader == null) { + log.error("下载失败,文件存储类型不支持下载,storageType:{}, isOSS:{}", fileBean.getStorageType(), fileBean.getIsOSS()); + throw new UploadGeneralException("下载失败"); + } + DownloadFile downloadFile = new DownloadFile(); + downloadFile.setFileUrl(fileBean.getFileUrl()); + InputStream inputStream = downloader.getInputStream(downloadFile); + BufferedInputStream bis = new BufferedInputStream(inputStream); + try { + zos.putNextEntry(new ZipEntry(userFile1.getFilePath())); + + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + out.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + out.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } } @Override diff --git a/pom.xml b/pom.xml index 0a30ed3..fa44a75 100644 --- a/pom.xml +++ b/pom.xml @@ -92,25 +92,6 @@ mybatis-plus-boot-starter 3.4.1 - - - - - - - - - - - - - - - - - - - org.apache.shiro shiro-core @@ -123,7 +104,6 @@ file-common file-web -