From f1adbb041f8c56e66a75c9e49d775b9493825a79 Mon Sep 17 00:00:00 2001 From: xiezhijun <15270898033@163.com> Date: Sat, 6 Mar 2021 00:15:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E7=AE=A1=E7=90=86=E7=9A=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../custom/SysCustomerCaseController.java | 57 +++++---------- .../common/utils/oss/AliyunOSSUtils.java | 72 +++++++++++++++++-- .../custom/domain/SysCustomerCaseFile.java | 2 + stdiet-ui/src/api/custom/customerCase.js | 8 +-- .../components/FileDownload/MuchFileDown.vue | 4 +- .../src/components/FileUpload/DragUpload.vue | 4 +- .../src/views/custom/customerCase/index.vue | 32 ++++++--- 7 files changed, 112 insertions(+), 67 deletions(-) diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java index 47c95eb63..7ac7dd7d4 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCustomerCaseController.java @@ -1,13 +1,16 @@ package com.stdiet.web.controller.custom; import java.io.InputStream; +import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.List; import com.stdiet.common.config.AliyunOSSConfig; import com.stdiet.common.config.RuoYiConfig; import com.stdiet.common.constant.Constants; import com.stdiet.common.exception.file.FileNameLengthLimitExceededException; +import com.stdiet.common.utils.DateUtils; import com.stdiet.common.utils.StringUtils; import com.stdiet.common.utils.file.FileUploadUtils; import com.stdiet.common.utils.file.FileUtils; @@ -15,15 +18,9 @@ import com.stdiet.common.utils.file.MimeTypeUtils; import com.stdiet.common.utils.oss.AliyunOSSUtils; import com.stdiet.custom.domain.SysCustomerCaseFile; import com.stdiet.custom.dto.request.FileRequest; -import com.sun.deploy.net.HttpResponse; -import io.swagger.models.auth.In; -import org.aspectj.weaver.loadtime.Aj; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.StreamingHttpOutputMessage; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.unit.DataUnit; import org.springframework.web.bind.annotation.*; import com.stdiet.common.annotation.Log; import com.stdiet.common.core.controller.BaseController; @@ -37,6 +34,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.xml.crypto.Data; /** * 客户案例管理Controller @@ -127,6 +125,17 @@ public class SysCustomerCaseController extends BaseController public TableDataInfo getFileListByCaseId(@RequestParam("caseId")Long caseId) { List list = sysCustomerCaseService.getFileListByCaseId(caseId); + List fileUrl = new ArrayList<>(); + for (SysCustomerCaseFile caseFile : list) { + fileUrl.add(caseFile.getFileUrl()); + } + List downUrlList = AliyunOSSUtils.generatePresignedUrl(fileUrl); + if(downUrlList != null && downUrlList.size() > 0){ + int index = 0; + for (String downUrl : downUrlList) { + list.get(index).setDownUrl(downUrl); + } + } return getDataTable(list); } @@ -147,7 +156,7 @@ public class SysCustomerCaseController extends BaseController } FileUploadUtils.assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - String fileUrl = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix, file.getOriginalFilename(), file); + String fileUrl = AliyunOSSUtils.uploadFileInputSteam(AliyunOSSConfig.casePrefix, DateUtils.getDate()+"/"+file.getOriginalFilename(), file); AjaxResult ajax = null; if(StringUtils.isNotEmpty(fileUrl)){ @@ -162,36 +171,4 @@ public class SysCustomerCaseController extends BaseController return AjaxResult.error("文件上传失败"); } } - - /** - * 下载案例文件 - * @param - * @return - */ - @PostMapping("/downCaseFile") - @PreAuthorize("@ss.hasPermi('custom:customerCase:list')") - public void downCaseFile(@RequestBody FileRequest fileRequest, HttpServletRequest request, HttpServletResponse response) { - /*try{ - InputStream fileStream = AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()); - byte[] body = new byte[fileStream.available()]; - fileStream.read(body); - HttpHeaders headers = new HttpHeaders(); - headers.add("Content-Disposition", "attchement;filename=" + fileRequest.getFileName()); - HttpStatus statusCode = HttpStatus.OK; - ResponseEntity entity = new ResponseEntity(body, headers, statusCode); - return entity; - }catch (Exception e) { - e.printStackTrace(); - } - return null;*/ - try { - response.setCharacterEncoding("utf-8"); - response.setContentType("multipart/form-data"); - response.setHeader("Content-Disposition", - "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fileRequest.getFileName())); - FileUtils.writeBytes(AliyunOSSUtils.downloadFile(fileRequest.getFileUrl()), response.getOutputStream()); - }catch (Exception e){ - e.printStackTrace(); - } - } } \ No newline at end of file diff --git a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java index 583042321..0d063a081 100644 --- a/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java +++ b/stdiet-common/src/main/java/com/stdiet/common/utils/oss/AliyunOSSUtils.java @@ -3,17 +3,28 @@ package com.stdiet.common.utils.oss; import com.aliyun.oss.model.GetObjectRequest; import com.aliyun.oss.model.OSSObject; import com.stdiet.common.config.AliyunOSSConfig; +import com.stdiet.common.utils.file.FileUtils; import org.springframework.web.multipart.MultipartFile; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; import java.util.UUID; -public class AliyunOSSUtils { ; +public class AliyunOSSUtils { + + //下载链接默认有效期 + private static final Long expire = 3600L * 1000 * 24; public static OSS getOssClient() { return new OSSClientBuilder().build(AliyunOSSConfig.EndPoint, AliyunOSSConfig.AccessKeyID, AliyunOSSConfig.AccessKeySecret); @@ -63,10 +74,10 @@ public class AliyunOSSUtils { ; //去尾 String tail = oranName.substring(cutPoint); //返回正确的带路径的图片名称 - return prefix + head + uuid + tail; + return prefix + head + uuid + "_" + tail; } //不存在 直接返回 - return prefix + uuid + oranName; + return prefix + uuid + "_" + oranName; } /** @@ -86,8 +97,8 @@ public class AliyunOSSUtils { ; String prefix = originalFilename.substring(0,cutPoint); //获取后缀名 String suffix = originalFilename.substring(cutPoint + 1); - //创建临时文件 - file = File.createTempFile(prefix, suffix); + //创建临时文件,prefix最少三位 + file = File.createTempFile((prefix != null && prefix.length() >= 3 ? prefix : prefix+"ab"), suffix); //multipartFile2file multipartFile.transferTo(file); //删除临时文件 @@ -194,7 +205,7 @@ public class AliyunOSSUtils { ; * * @param fileURL 文件的url */ - public static InputStream downloadFile(String fileURL) throws IOException { + public static void downloadFile(String fileURL, String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException { //将url解析成objectName String objectName = getObjectName(fileURL); @@ -207,10 +218,57 @@ public class AliyunOSSUtils { ; //获取流 InputStream streamData = ossObject.getObjectContent(); + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, fileName)); + FileUtils.writeBytes(streamData , response.getOutputStream()); + + // 关闭OSSClient。 + ossClient.shutdown(); + } + + /** + * + * @param fileUrl + * @return + */ + public static String generatePresignedUrl(String fileUrl){ + // 创建OSSClient实例。 + OSS ossClient = getOssClient(); + + Date expiration = new Date(System.currentTimeMillis() + expire); + + String url = ossClient.generatePresignedUrl(AliyunOSSConfig.Buckets, getObjectName(fileUrl), expiration).toString(); + // 关闭OSSClient。 ossClient.shutdown(); - return streamData; + return url; + } + + /** + * + * @param fileUrl + * @return + */ + public static List generatePresignedUrl(List fileUrlList){ + List downUrlList = new ArrayList<>(); + + // 创建OSSClient实例。 + OSS ossClient = getOssClient(); + + Date expiration = new Date(System.currentTimeMillis() + expire); + + for (String fileUrl : fileUrlList) { + String url = ossClient.generatePresignedUrl(AliyunOSSConfig.Buckets, getObjectName(fileUrl), expiration).toString(); + downUrlList.add(url); + } + + // 关闭OSSClient。 + ossClient.shutdown(); + + return downUrlList; } /** diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java index d8d1e62b8..9e9fb675d 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCustomerCaseFile.java @@ -26,6 +26,8 @@ public class SysCustomerCaseFile extends BaseEntity @Excel(name = "文件路径") private String fileUrl; + private String downUrl; + /** 文件名字 */ @Excel(name = "文件名字") private String fileName; diff --git a/stdiet-ui/src/api/custom/customerCase.js b/stdiet-ui/src/api/custom/customerCase.js index 1d8c6358a..0f388c098 100644 --- a/stdiet-ui/src/api/custom/customerCase.js +++ b/stdiet-ui/src/api/custom/customerCase.js @@ -71,12 +71,8 @@ export function uploadCseFile(data) { } // 下载案例文件 -export function downCaseFile(data) { - return request({ - url: '/custom/customerCase/downCaseFile', - method: 'post', - data: data - }) +export function downCaseFile(downUrl) { + window.location.href = downUrl; } diff --git a/stdiet-ui/src/components/FileDownload/MuchFileDown.vue b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue index f677b5a4f..7df657a4f 100644 --- a/stdiet-ui/src/components/FileDownload/MuchFileDown.vue +++ b/stdiet-ui/src/components/FileDownload/MuchFileDown.vue @@ -12,7 +12,7 @@ size="mini" type="text" icon="el-icon-download" - @click="" + @click="downloadFile(scope.row)" >下载 @@ -66,7 +66,7 @@ export default { this.fileList = []; }, downloadFile(file){ - downCaseFile(file); + downCaseFile(file.downUrl); } }, }; diff --git a/stdiet-ui/src/components/FileUpload/DragUpload.vue b/stdiet-ui/src/components/FileUpload/DragUpload.vue index 6ce5494b8..0caedacf4 100644 --- a/stdiet-ui/src/components/FileUpload/DragUpload.vue +++ b/stdiet-ui/src/components/FileUpload/DragUpload.vue @@ -17,7 +17,7 @@ :auto-upload="false">
将文件拖到此处,或点击上传
-
每个案例最多上传5个文件,且每个文件不超过50M
+
每个案例最多上传5个文件,且每个文件不超过10M