Raod 2 years ago
parent c9cc5f37c8
commit dd0a419daf

@ -61,6 +61,12 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.8</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId> <artifactId>spring-cloud-context</artifactId>
@ -85,6 +91,12 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-starter-gaea-oss</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>

@ -118,7 +118,8 @@ public interface ResponseCode {
String FILE_SUFFIX_UNSUPPORTED = "2002"; String FILE_SUFFIX_UNSUPPORTED = "2002";
String FILE_UPLOAD_ERROR = "2003"; String FILE_UPLOAD_ERROR = "2003";
String FILE_ONT_EXSIT = "2004"; String FILE_ONT_EXSIT = "2004";
String LIST_IS_EMPTY = "2005"; String FILE_OPERATION_FAILED = "file.operation.failed";
String PUSHCODE_NEED_UNIQUE = "3001"; String PUSHCODE_NEED_UNIQUE = "3001";
String RECEIVER_IS_EMPTY = "3002"; String RECEIVER_IS_EMPTY = "3002";
String DATA_SOURCE_CONNECTION_FAILED = "4001"; String DATA_SOURCE_CONNECTION_FAILED = "4001";

@ -80,13 +80,13 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
@Autowired @Autowired
private ReportService reportService; private ReportService reportService;
@Value("${customer.file.downloadPath:''}") @Value("${spring.gaea.subscribes.oss.downloadPath:}")
private String fileDownloadPath; private String fileDownloadPath;
@Value("${customer.file.dist-path:''}") @Value("${customer.file.tmp-path:.}")
private String dictPath; private String dictPath;
private final static String ZIP_PATH = "/zip/"; private final static String ZIP_PATH = "/tmp_zip/";
private final static String JSON_PATH = "dashboard.json"; private final static String JSON_PATH = "dashboard.json";
private Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>(); private Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>();
@ -395,13 +395,9 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
queryWrapper.eq(GaeaFile::getFileId, fileName); queryWrapper.eq(GaeaFile::getFileId, fileName);
GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper); GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper);
if (null != gaeaFile) { if (null != gaeaFile) {
String fileType = gaeaFile.getFileType(); byte[] file = gaeaFileService.getFile(gaeaFile.getFileId());
path = path + "/image/" + fileName + "." + fileType; path = path + "/image/";
//path = /app/disk/upload/zip/UUID/image FileUtil.byte2File(file, path, gaeaFile.getFileId().concat(".").concat(gaeaFile.getFileType()));
//原始文件的路径
String filePath = gaeaFile.getFilePath();
FileUtil.copyFileUsingFileChannels(filePath, path);
} }
} }

@ -54,4 +54,11 @@ public interface GaeaFileService extends GaeaBaseService<GaeaFileParam, GaeaFile
* @return * @return
*/ */
ResponseEntity<byte[]> download(HttpServletRequest request, HttpServletResponse response, String fileId); ResponseEntity<byte[]> download(HttpServletRequest request, HttpServletResponse response, String fileId);
/**
*
* @param fileId
* @return
*/
byte[] getFile(String fileId);
} }

@ -4,59 +4,51 @@ import com.anji.plus.gaea.constant.BaseOperationEnum;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessException; import com.anji.plus.gaea.exception.BusinessException;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anji.plus.gaea.oss.exceptions.GaeaOSSException;
import com.anji.plus.gaea.oss.exceptions.GaeaOSSTypeLimitedException;
import com.anji.plus.gaea.oss.ossbuilder.GaeaOSSTemplate;
import com.anji.plus.gaea.oss.utils.ResponseUtil;
import com.anjiplus.template.gaea.business.code.ResponseCode; import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.file.dao.GaeaFileMapper; import com.anjiplus.template.gaea.business.modules.file.dao.GaeaFileMapper;
import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile; import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile;
import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService; import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
import com.anjiplus.template.gaea.business.modules.file.util.StringPatternUtil;
import com.anjiplus.template.gaea.business.util.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.ContentType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.CacheControl; import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.net.URLEncoder; import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* (GaeaFile)ServiceImpl *
* * @author: Raod
* @author peiyanni * @since: 2022-08-31
* @since 2021-02-18 14:48:26
*/ */
@Service @Service
@Slf4j @Slf4j
@RefreshScope
public class GaeaFileServiceImpl implements GaeaFileService { public class GaeaFileServiceImpl implements GaeaFileService {
@Value("${customer.file.dist-path:''}") @Value("${spring.gaea.subscribes.oss.downloadPath:''}")
private String dictPath;
@Value("${customer.file.white-list:''}")
private String whiteList;
@Value("${customer.file.excelSuffix:''}")
private String excelSuffix;
@Value("${customer.file.downloadPath:''}")
private String fileDownloadPath; private String fileDownloadPath;
@Autowired
private GaeaOSSTemplate gaeaOSSTemplate;
@Autowired @Autowired
private GaeaFileMapper gaeaFileMapper; private GaeaFileMapper gaeaFileMapper;
@ -69,26 +61,13 @@ public class GaeaFileServiceImpl implements GaeaFileService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public GaeaFile upload(MultipartFile multipartFile, File file, String customFileName) { public GaeaFile upload(MultipartFile multipartFile, File file, String customFileName) {
try { String originalFilename = multipartFile.getOriginalFilename();
String fileName = "";
if (null != multipartFile) {
fileName = multipartFile.getOriginalFilename();
}else {
fileName = file.getName();
}
if (StringUtils.isBlank(fileName)) { if (StringUtils.isBlank(originalFilename)) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_EMPTY_FILENAME); throw BusinessExceptionBuilder.build(ResponseCode.FILE_EMPTY_FILENAME);
} }
// 文件后缀 .png
String suffixName = fileName.substring(fileName.lastIndexOf(".")); String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileInstruction = fileName.substring(0, fileName.lastIndexOf("."));
//白名单校验(不区分大小写)
List<String> list = new ArrayList<>(Arrays.asList(whiteList.split("\\|")));
list.addAll(list.stream().map(String::toUpperCase).collect(Collectors.toList()));
if (!list.contains(suffixName)) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_SUFFIX_UNSUPPORTED);
}
// 生成文件唯一性标识 // 生成文件唯一性标识
String fileId; String fileId;
if (StringUtils.isBlank(customFileName)) { if (StringUtils.isBlank(customFileName)) {
@ -96,38 +75,46 @@ public class GaeaFileServiceImpl implements GaeaFileService {
} else { } else {
fileId = customFileName; fileId = customFileName;
} }
String newFileName = fileId + suffixName; // 生成在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png
// 本地文件保存路径 String fileObjectName = fileId + suffixName;
String filePath = dictPath + newFileName; // 生成链接通过fileId http访问路径 http://10.108.3.121:9089/meta/file/download/402b6193e70e40a9bf5b73a78ea1e8ab
String urlPath = fileDownloadPath + "/" + fileId; String urlPath = fileDownloadPath + "/" + fileId;
// 上传文件
try{
gaeaOSSTemplate.uploadFileByInputStream(multipartFile, fileObjectName);
}catch (GaeaOSSTypeLimitedException e){
log.error("上传失败GaeaOSSTypeLimitedException", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_SUFFIX_UNSUPPORTED, e.getMessage());
}catch (GaeaOSSException e){
log.error("上传失败GaeaOSSException", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR, e.getMessage());
}
// 保存到文件管理中
GaeaFile gaeaFile = new GaeaFile(); GaeaFile gaeaFile = new GaeaFile();
gaeaFile.setFilePath(filePath);
gaeaFile.setFileId(fileId); gaeaFile.setFileId(fileId);
gaeaFile.setFilePath(fileObjectName);
gaeaFile.setUrlPath(urlPath); gaeaFile.setUrlPath(urlPath);
gaeaFile.setFileType(suffixName.replace(".", "")); gaeaFile.setFileType(suffixName.replace(".", ""));
gaeaFile.setFileInstruction(fileInstruction); gaeaFile.setFileInstruction(originalFilename);
gaeaFileMapper.insert(gaeaFile); insert(gaeaFile);
//写文件 将文件保存/app/dictPath/upload/下
java.io.File dest = new java.io.File(dictPath + newFileName);
java.io.File parentFile = dest.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
if (null != multipartFile) {
multipartFile.transferTo(dest);
}else {
FileUtil.copyFileUsingFileChannels(file, dest);
}
// 将完整的http访问路径返回
return gaeaFile; return gaeaFile;
} catch (BusinessException e){
throw BusinessExceptionBuilder.build(e.getCode());
}catch (Exception e) {
log.error("file upload error", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_UPLOAD_ERROR);
} }
private MultipartFile getMultipartFile(File file){
FileInputStream fileInputStream;
MultipartFile multipartFile;
try {
fileInputStream = new FileInputStream(file);
multipartFile = new MockMultipartFile(file.getName(),file.getName(),
ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream);
} catch (Exception e) {
log.error("file转MultipartFile失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
}
return multipartFile;
} }
/** /**
@ -150,52 +137,73 @@ public class GaeaFileServiceImpl implements GaeaFileService {
*/ */
@Override @Override
public GaeaFile upload(File file, String customFileName) { public GaeaFile upload(File file, String customFileName) {
return upload(null, file, customFileName); return upload(getMultipartFile(file));
} }
@Override @Override
public ResponseEntity<byte[]> download(HttpServletRequest request, HttpServletResponse response, String fileId) { public ResponseEntity<byte[]> download(HttpServletRequest request, HttpServletResponse response, String fileId) {
try { try {
String userAgent = request.getHeader("User-Agent"); // fileId必填
boolean isIeBrowser = userAgent.indexOf("MSIE") > 0; if(StringUtils.isBlank(fileId)){
//根据fileId从gaea_file中读出filePath throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
}
// 根据fileId从gaea_file中读出filePath
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(GaeaFile::getFileId, fileId); queryWrapper.eq(GaeaFile::getFileId, fileId);
GaeaFile gaeaFile = gaeaFileMapper.selectOne(queryWrapper); GaeaFile gaeaFile = gaeaFileMapper.selectOne(queryWrapper);
if (null == gaeaFile) { if (null == gaeaFile) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
} }
//解析文件路径、文件名和后缀
String filePath = gaeaFile.getFilePath(); String userAgent = request.getHeader("User-Agent");
if (StringUtils.isBlank(filePath)) { boolean isIEBrowser = userAgent.indexOf("MSIE") > 0;
// 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png
String fileObjectName = gaeaFile.getFilePath();
String originalFilename = gaeaFile.getFileInstruction();
if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT); throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
} }
String filename = filePath.substring(filePath.lastIndexOf(File.separator));
String fileSuffix = filename.substring(filename.lastIndexOf(".")); // 调用文件存储工厂,读取文件,返回字节数组
byte[] fileBytes = gaeaOSSTemplate.downloadFile(fileObjectName);
//根据文件后缀来判断,是显示图片\视频\音频,还是下载文件
File file = new File(filePath); // 根据文件后缀来判断,是显示图片\视频\音频,还是下载文件
ResponseEntity.BodyBuilder builder = ResponseEntity.ok(); return ResponseUtil.writeBody(originalFilename, fileBytes, isIEBrowser);
builder.contentLength(file.length()); } catch (Exception e) {
if (StringPatternUtil.stringMatchIgnoreCase(fileSuffix, "(.png|.jpg|.jpeg|.bmp|.gif|.icon)")) { log.error("file download error", e);
builder.cacheControl(CacheControl.noCache()).contentType(MediaType.IMAGE_PNG); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} else if (StringPatternUtil.stringMatchIgnoreCase(fileSuffix, "(.flv|.swf|.mkv|.avi|.rm|.rmvb|.mpeg|.mpg|.ogg|.ogv|.mov|.wmv|.mp4|.webm|.wav|.mid|.mp3|.aac)")) {
builder.header("Content-Type", "video/mp4; charset=UTF-8");
} else {
//application/octet-stream 二进制数据流(最常见的文件下载)
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
filename = URLEncoder.encode(filename, "UTF-8");
if (isIeBrowser) {
builder.header("Content-Disposition", "attachment; filename=" + filename);
} else {
builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + filename);
} }
} }
return builder.body(FileUtils.readFileToByteArray(file));
} catch (Exception e) { /**
log.error("file download error: {}", e); *
return null; *
* @param fileId
* @return
*/
@Override
public byte[] getFile(String fileId) {
// fileId必填
if(StringUtils.isBlank(fileId)){
throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
}
// 根据fileId从gaea_file中读出filePath
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(GaeaFile::getFileId, fileId);
GaeaFile gaeaFile = gaeaFileMapper.selectOne(queryWrapper);
if (null == gaeaFile) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
}
// 在oss中存储的文件名 402b6193e70e40a9bf5b73a78ea1e8ab.png
String fileObjectName = gaeaFile.getFilePath();
String originalFilename = gaeaFile.getFileInstruction();
if (StringUtils.isBlank(fileObjectName) || StringUtils.isBlank(originalFilename)) {
throw BusinessExceptionBuilder.build(ResponseCode.FILE_ONT_EXSIT);
} }
// 调用文件存储工厂,读取文件,返回字节数组
return gaeaOSSTemplate.downloadFile(fileObjectName);
} }
/** /**
@ -212,10 +220,7 @@ public class GaeaFileServiceImpl implements GaeaFileService {
// 删除本地文件 // 删除本地文件
entities.forEach(gaeaFile -> { entities.forEach(gaeaFile -> {
String filePath = gaeaFile.getFilePath(); String filePath = gaeaFile.getFilePath();
File file = new File(filePath); gaeaOSSTemplate.deleteFile(filePath);
if (file.exists()) {
file.delete();
}
}); });
} }

@ -58,10 +58,10 @@ public class ReportExcelServiceImpl implements ReportExcelService {
@Autowired @Autowired
private ReportMapper reportMapper; private ReportMapper reportMapper;
@Value("${customer.file.dist-path:''}") @Value("${customer.file.tmp-path:.}")
private String dictPath; private String dictPath;
@Value("${customer.file.downloadPath:''}") @Value("${spring.gaea.subscribes.oss.downloadPath:''}")
private String fileDownloadPath; private String fileDownloadPath;
@Autowired @Autowired

@ -1,7 +1,7 @@
package com.anjiplus.template.gaea.business.util; package com.anjiplus.template.gaea.business.util;
import com.anji.plus.gaea.code.ResponseCode;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anjiplus.template.gaea.business.code.ResponseCode;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -42,7 +42,7 @@ public class FileUtil {
log.info("链接下载图片:{},临时路径:{}", urlPath, path); log.info("链接下载图片:{},临时路径:{}", urlPath, path);
} catch (IOException e) { } catch (IOException e) {
log.error("根据链接下载失败", e); log.error("根据链接下载失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -66,14 +66,14 @@ public class FileUtil {
outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} catch (IOException e) { } catch (IOException e) {
log.error("复制文件失败", e); log.error("复制文件失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} finally { } finally {
try { try {
inputChannel.close(); inputChannel.close();
outputChannel.close(); outputChannel.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
} }
@ -106,7 +106,7 @@ public class FileUtil {
outputStream.close(); outputStream.close();
} catch (Exception e) { } catch (Exception e) {
log.error("写入文件失败", e); log.error("写入文件失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -132,20 +132,20 @@ public class FileUtil {
return sbf.toString(); return sbf.toString();
} catch (IOException e) { } catch (IOException e) {
log.error("读文件失败", e); log.error("读文件失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} finally { } finally {
if (null != isr) { if (null != isr) {
try { try {
isr.close(); isr.close();
} catch (IOException e) { } catch (IOException e) {
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
if (reader != null) { if (reader != null) {
try { try {
reader.close(); reader.close();
} catch (IOException e1) { } catch (IOException e1) {
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e1.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e1.getMessage());
} }
} }
} }
@ -185,14 +185,14 @@ public class FileUtil {
compress(srcFile, zipOut, baseDir); compress(srcFile, zipOut, baseDir);
} catch (IOException e) { } catch (IOException e) {
log.error("压缩文件夹失败", e); log.error("压缩文件夹失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} finally { } finally {
if (null != zipOut) { if (null != zipOut) {
try { try {
zipOut.close(); zipOut.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
out = null; out = null;
} }
@ -201,7 +201,7 @@ public class FileUtil {
out.close(); out.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
} }
@ -246,14 +246,14 @@ public class FileUtil {
} catch (IOException e) { } catch (IOException e) {
log.error("压缩文件夹失败", e); log.error("压缩文件夹失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} finally { } finally {
if (null != bis) { if (null != bis) {
try { try {
bis.close(); bis.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
} }
@ -264,23 +264,26 @@ public class FileUtil {
decompress(new ZipFile(zipFile), dstPath); decompress(new ZipFile(zipFile), dstPath);
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
public static void decompress(MultipartFile zipFile, String dstPath) { public static void decompress(MultipartFile zipFile, String dstPath) {
try { try {
File file = new File(dstPath + File.separator + zipFile.getOriginalFilename()); File dir = new File(dstPath);
if (!file.getParentFile().exists()) { if (!dir.exists()){
file.getParentFile().mkdirs(); dir.mkdirs();
} }
String path = dir.getPath();
String absolutePath = dir.getAbsolutePath();
File file = new File(dir.getAbsolutePath() + File.separator + zipFile.getOriginalFilename());
zipFile.transferTo(file); zipFile.transferTo(file);
decompress(new ZipFile(file), dstPath); decompress(new ZipFile(file), dstPath);
//解压完删除 //解压完删除
file.delete(); file.delete();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -326,14 +329,14 @@ public class FileUtil {
} }
} catch (IOException e) { } catch (IOException e) {
log.error("解压失败", e); log.error("解压失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} finally { } finally {
if (null != in) { if (null != in) {
try { try {
in.close(); in.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -342,7 +345,7 @@ public class FileUtil {
out.close(); out.close();
} catch (IOException e) { } catch (IOException e) {
log.error("", e); log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
} }
@ -350,7 +353,7 @@ public class FileUtil {
zip.close(); zip.close();
} catch (IOException e) { } catch (IOException e) {
log.error("解压失败", e); log.error("解压失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -371,7 +374,7 @@ public class FileUtil {
ins.close(); ins.close();
} catch (Exception e) { } catch (Exception e) {
log.error("获取流文件失败", e); log.error("获取流文件失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
} }
} }
@ -399,8 +402,49 @@ public class FileUtil {
}); });
} catch (IOException e) { } catch (IOException e) {
log.error("删除文件失败", e); log.error("删除文件失败", e);
throw BusinessExceptionBuilder.build(ResponseCode.FAIL_CODE, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
}
}
/**
* byte file
*/
public static File byte2File(byte[] buf, String filePath, String fileName){
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try{
File dir = new File(filePath);
if (!dir.exists()){
dir.mkdirs();
}
file = new File(filePath + File.separator + fileName);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(buf);
}catch (Exception e){
log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
}
finally{
if (bos != null){
try{
bos.close();
}catch (IOException e){
log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
}
}
if (fos != null){
try{
fos.close();
}catch (IOException e){
log.error("", e);
throw BusinessExceptionBuilder.build(ResponseCode.FILE_OPERATION_FAILED, e.getMessage());
}
}
} }
return file;
} }

@ -4,8 +4,15 @@ spring:
url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root username: root
password: appuser@anji password: appuser@anji
gaea:
customer: subscribes:
file: oss: #文件存储
dist-path: D:\Workspace\AJ-Report\report-core\upload enabled: true
##允许上传的文件后缀
file-type-while-list: .png|.jpg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi|.jpeg
# 用于文件上传成功后生成文件的下载公网完整URL
downloadPath: http://127.0.0.1:9095/file/download downloadPath: http://127.0.0.1:9095/file/download
nfs:
path: D:\\aaa\\

@ -4,7 +4,3 @@ spring:
url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false url: jdbc:mysql://10.108.26.197:3306/aj_report?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username: root username: root
password: appuser@anji password: appuser@anji
customer:
file:
dist-path: /app/disk/upload/

@ -46,6 +46,30 @@ spring:
placeholder-replacement: false placeholder-replacement: false
init-sqls: init-sqls:
- CREATE DATABASE IF NOT EXISTS `aj_report` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; - CREATE DATABASE IF NOT EXISTS `aj_report` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
gaea:
subscribes:
oss: #文件存储
enabled: true
##允许上传的文件后缀
file-type-while-list: .png|.jpg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi|.jpeg|.aaa
# 用于文件上传成功后生成文件的下载公网完整URL
downloadPath: http://10.108.26.197:9095/file/download
nfs:
path: /app/disk/upload/
#若要使用minio文件存储请启用以下配置
#minio:
# url: http://127.0.0.1
# port: 9000
# access-key: minioreport
# secret-key: minioreport
# bucket-name: aj-report
#若要使用amazonS3文件存储请启用以下配置
#amazonS3:
# url: http://127.0.0.1
# access-key: access-key
# secret-key: secret-key
# bucket-name: AJ-Report
#若minio和amazonS3都没有使用服务器高可用的nfs共享盘
mybatis-plus: mybatis-plus:
configuration: configuration:
@ -64,16 +88,6 @@ logging:
# 本应用自定义参数 # 本应用自定义参数
customer: customer:
# 开发测试用本地文件,如果是生产,请考虑使用对象存储
file:
#上传对应本地全路径,目录必须是真实存在的,注意 Win是 \ 且有盘符linux是 / 无盘符
dist-path: /app/disk/upload/
#dist-path: D:\Download
white-list: .png|.jpg|.jpeg|.gif|.icon|.pdf|.xlsx|.xls|.csv|.mp4|.avi
excelSuffix: .xlsx|.xls|.csv
#上传对应下载的下载链接路径 http://serverip:9095/file/download
downloadPath: http://10.108.26.197:9095/file/download
# 跳过token验证和权限验证的url清单 # 跳过token验证和权限验证的url清单
skip-authenticate-urls: /gaeaDict/all, /login, /static, /file/download/, /index.html, /favicon.ico, /reportShare/detailByCode skip-authenticate-urls: /gaeaDict/all, /login, /static, /file/download/, /index.html, /favicon.ico, /reportShare/detailByCode
user: user:

@ -9,8 +9,9 @@ user.old.password.error=user old password error
1013=The code does not allow duplication 1013=The code does not allow duplication
2001=File names are not allowed to be empty 2001=File names are not allowed to be empty
2002=Unsupported suffix type 2002=Unsupported suffix type
2003=File upload failed 2003=File upload failed:{0}
2004=File does not exist 2004=File does not exist
file.operation.failed=File operation failed\uFF1A{0}
field.not.null={} can not be null field.not.null={} can not be null
field.not.empty={} can not be empty field.not.empty={} can not be empty

@ -8,8 +8,9 @@ user.old.password.error=\u65E7\u5BC6\u7801\u4E0D\u6B63\u786E
1013=\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D 1013=\u7F16\u7801\u4E0D\u5141\u8BB8\u91CD\u590D
2001=\u6587\u4EF6\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A 2001=\u6587\u4EF6\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A
2002=\u6587\u4EF6\u7C7B\u578B\u4E0D\u652F\u6301 2002=\u6587\u4EF6\u7C7B\u578B\u4E0D\u652F\u6301
2003=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25 2003=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF1A{0}
2004=\u6587\u4EF6\u4E0D\u5B58\u5728 2004=\u6587\u4EF6\u4E0D\u5B58\u5728
file.operation.failed=\u6587\u4EF6\u64CD\u4F5C\u5931\u8D25\uFF1A{0}
field.not.null={}\u4E0D\u80FD\u4E3Anull field.not.null={}\u4E0D\u80FD\u4E3Anull
field.not.empty={}\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32 field.not.empty={}\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32

Loading…
Cancel
Save