Commit 01a5c508 by zhangxingmin

Merge remote-tracking branch 'origin/test' into dev_zxm

# Conflicts:
#	yd-oss-api/src/main/java/com/yd/oss/api/controller/ApiExcelController.java
#	yd-oss-api/src/main/java/com/yd/oss/api/service/ApiExcelService.java
#	yd-oss-api/src/main/java/com/yd/oss/api/service/impl/ApiExcelServiceImpl.java
#	yd-oss-api/yd-oss-api.iml
#	yd-oss-feign/src/main/java/com/yd/oss/feign/client/ApiExcelFeignClient.java
#	yd-oss-feign/src/main/java/com/yd/oss/feign/fallback/ApiExcelFeignFallbackFactory.java
#	yd-oss-feign/yd-oss-feign.iml
#	yd-oss-service/yd-oss-service.iml
parents b4d95f8d 3bff83bc
# 基础镜像
FROM openjdk:8
# 维护人
LABEL maintainer="zxm<2060197959@qq.com>"
# 创建目录
RUN mkdir -p /home/app
# 拷贝项目jar - 使用可执行的 fat JAR
COPY target/yd-oss-api-1.0-SNAPSHOT-exec.jar /home/app/yd-oss-api.jar
# 执行命令启动jar
ENTRYPOINT ["java", "-jar", "/home/app/yd-oss-api.jar"]
# 暴露端口
EXPOSE 9106
...@@ -70,4 +70,25 @@ ...@@ -70,4 +70,25 @@
<artifactId>yd-oss-service</artifactId> <artifactId>yd-oss-service</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
<mainClass>com.yd.oss.api.OssApiApplication</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>
...@@ -3,6 +3,8 @@ package com.yd.oss.api.controller; ...@@ -3,6 +3,8 @@ package com.yd.oss.api.controller;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiExcelService; import com.yd.oss.api.service.ApiExcelService;
import com.yd.oss.feign.client.ApiExcelFeignClient; import com.yd.oss.feign.client.ApiExcelFeignClient;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiExportRequest;
import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest; import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest;
import com.yd.oss.feign.response.ApiOssExcelParseResponse; import com.yd.oss.feign.response.ApiOssExcelParseResponse;
import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse; import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
...@@ -49,6 +51,15 @@ public class ApiExcelController implements ApiExcelFeignClient { ...@@ -49,6 +51,15 @@ public class ApiExcelController implements ApiExcelFeignClient {
} }
/** /**
* 导出excel(通用)
* @return
*/
@Override
public Result<ExportResult> export(ApiExportRequest request) {
return apiExcelService.export(request.getDataList(),request.getExportParam(),request.getEntityClass());
}
/**
* 通用Excel导入接口 * 通用Excel导入接口
* @param file Excel文件 * @param file Excel文件
* @param headerRow 表头行号(默认第1行,从0开始) * @param headerRow 表头行号(默认第1行,从0开始)
......
package com.yd.oss.api.service; package com.yd.oss.api.service;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest; import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest;
import com.yd.oss.feign.response.ApiOssExcelParseResponse; import com.yd.oss.feign.response.ApiOssExcelParseResponse;
import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse; import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
import com.yd.oss.feign.result.ImportResult; import com.yd.oss.feign.result.ImportResult;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface ApiExcelService { public interface ApiExcelService {
Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request); Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request);
Result<ApiOssExcelParseResponse> parse(MultipartFile file, String[] sheetClassNames); Result<ApiOssExcelParseResponse> parse(MultipartFile file, String[] sheetClassNames);
Result<ExportResult> export(List<?> dataList, ExportParam exportParam, Class<?> entityClass);
Result<ImportResult> importExcel(MultipartFile file, Integer headerRow, Result<ImportResult> importExcel(MultipartFile file, Integer headerRow,
Integer dataStartRow, String requiredFields); Integer dataStartRow, String requiredFields);
......
...@@ -6,8 +6,11 @@ import com.yd.oss.api.service.ApiExcelService; ...@@ -6,8 +6,11 @@ import com.yd.oss.api.service.ApiExcelService;
import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest; import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest;
import com.yd.oss.feign.response.ApiOssExcelParseResponse; import com.yd.oss.feign.response.ApiOssExcelParseResponse;
import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse; import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.result.ImportResult; import com.yd.oss.feign.result.ImportResult;
import com.yd.oss.service.service.AppointmentExcelService; import com.yd.oss.service.service.AppointmentExcelService;
import com.yd.oss.service.service.ExcelExportService;
import com.yd.oss.service.service.ExcelImportService; import com.yd.oss.service.service.ExcelImportService;
import com.yd.oss.service.service.ExcelParserService; import com.yd.oss.service.service.ExcelParserService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -15,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -15,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -30,6 +35,9 @@ public class ApiExcelServiceImpl implements ApiExcelService { ...@@ -30,6 +35,9 @@ public class ApiExcelServiceImpl implements ApiExcelService {
private ExcelParserService excelParserService; private ExcelParserService excelParserService;
@Autowired @Autowired
private ExcelExportService excelExportService;
@Autowired
private ExcelImportService excelImportService; private ExcelImportService excelImportService;
/** /**
...@@ -74,6 +82,19 @@ public class ApiExcelServiceImpl implements ApiExcelService { ...@@ -74,6 +82,19 @@ public class ApiExcelServiceImpl implements ApiExcelService {
} }
/** /**
* 通用-Excel导出参数(如果传dataList附加数据,不传单纯导出表头参数)
* @param dataList
* @param exportParam
* @param entityClass
* @return
*/
@Override
public Result<ExportResult> export(List<?> dataList, ExportParam exportParam, Class<?> entityClass) {
ExportResult exportResult = excelExportService.exportAndUploadToOss(dataList,exportParam,entityClass);
return Result.success(exportResult);
}
/**
* 通用Excel导入接口 * 通用Excel导入接口
* @param file Excel文件 * @param file Excel文件
* @param headerRow 表头行号(默认第1行,从0开始) * @param headerRow 表头行号(默认第1行,从0开始)
......
...@@ -6,8 +6,10 @@ import com.yd.oss.api.service.ApiOssService; ...@@ -6,8 +6,10 @@ import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.response.ApiFileMetadataResponse; import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse; import com.yd.oss.feign.response.ApiUploadResponse;
import com.yd.oss.service.dto.FileMetadata; import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.UploadResult; import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.service.OssService; import com.yd.oss.service.service.OssService;
import com.yd.oss.service.utils.FileUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
...@@ -44,10 +46,11 @@ public class ApiOssServiceImpl implements ApiOssService { ...@@ -44,10 +46,11 @@ public class ApiOssServiceImpl implements ApiOssService {
} }
// 上传文件 // 上传文件
String fileKey = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(), bucket, uploadUser); OssUploadFileDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(),
bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename()));
// 获取上传结果(包含文件信息和访问URL) // 获取上传结果(包含文件信息和访问URL)
UploadResult result = ossService.getUploadResult(fileKey, Duration.ofHours(1)); UploadResult result = ossService.getUploadResult(ossUploadFileDto.getFileKey(), Duration.ofHours(1));
BeanUtils.copyProperties(result,response); BeanUtils.copyProperties(result,response);
......
...@@ -40,7 +40,7 @@ spring: ...@@ -40,7 +40,7 @@ spring:
# 配置中心 # 配置中心
config: config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) # 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: c1e4cbcf-d8b7-4da9-a75a-7b75890fc390 namespace: b3b01715-eb85-4242-992a-5aff03d864d4
# nacos的ip地址和端口 # nacos的ip地址和端口
server-addr: 139.224.145.34:8848 server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置 # 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
......
...@@ -111,15 +111,6 @@ ...@@ -111,15 +111,6 @@
<orderEntry type="library" name="Maven: p6spy:p6spy:3.9.1" level="project" /> <orderEntry type="library" name="Maven: p6spy:p6spy:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.31" level="project" /> <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.31" level="project" />
<orderEntry type="module" module-name="yd-oss-feign" /> <orderEntry type="module" module-name="yd-oss-feign" />
<orderEntry type="library" name="Maven: com.yd:yd-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.1.1" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3.3" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:11.8" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:11.8" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-common:1.0-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: com.yd:yd-common:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83" level="project" /> <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.6.6" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.6.6" level="project" />
...@@ -149,7 +140,6 @@ ...@@ -149,7 +140,6 @@
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-resource-server:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-resource-server:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-core:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-jose:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-jose:5.6.2" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:nimbus-jose-jwt:9.14" level="project" /> <orderEntry type="library" name="Maven: com.nimbusds:nimbus-jose-jwt:9.14" level="project" />
...@@ -170,6 +160,8 @@ ...@@ -170,6 +160,8 @@
<orderEntry type="library" name="Maven: com.yd:yd-framework:1.0-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: com.yd:yd-framework:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.6.6" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.6.6" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" /> <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.20.0" level="project" /> <orderEntry type="library" name="Maven: org.redisson:redisson:3.20.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.69.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" />
...@@ -190,6 +182,14 @@ ...@@ -190,6 +182,14 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.1.6" level="project" /> <orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.1.6" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-core:5.1.6" level="project" /> <orderEntry type="library" name="Maven: org.jodd:jodd-core:5.1.6" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.1.1" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3.3" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:11.8" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:11.8" level="project" />
<orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.15.1" level="project" /> <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.15.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" />
......
package com.yd.oss.feign.client; package com.yd.oss.feign.client;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.fallback.ApiExcelFeignFallbackFactory; import com.yd.oss.feign.fallback.ApiExcelFeignFallbackFactory;
import com.yd.oss.feign.request.ApiExportRequest;
import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest; import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest;
import com.yd.oss.feign.response.ApiOssExcelParseResponse; import com.yd.oss.feign.response.ApiOssExcelParseResponse;
import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse; import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
...@@ -18,7 +20,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -18,7 +20,7 @@ import org.springframework.web.multipart.MultipartFile;
/** /**
* Excel信息Feign客户端 * Excel信息Feign客户端
*/ */
@FeignClient(name = "yd-oss-api", fallbackFactory = ApiExcelFeignFallbackFactory.class) @FeignClient(name = "yd-oss-api",path = "/oss/api/excel",fallbackFactory = ApiExcelFeignFallbackFactory.class)
public interface ApiExcelFeignClient { public interface ApiExcelFeignClient {
/** /**
...@@ -40,6 +42,13 @@ public interface ApiExcelFeignClient { ...@@ -40,6 +42,13 @@ public interface ApiExcelFeignClient {
@RequestPart("sheetClassNames") String[] sheetClassNames); @RequestPart("sheetClassNames") String[] sheetClassNames);
/** /**
* 导出excel(通用)
* @return
*/
@PostMapping("/export")
Result<ExportResult> export(@Validated @RequestBody ApiExportRequest request);
/**
* 通用Excel导入接口 * 通用Excel导入接口
* @param file Excel文件 * @param file Excel文件
* @param headerRow 表头行号(默认第1行,从0开始) * @param headerRow 表头行号(默认第1行,从0开始)
......
package com.yd.oss.feign.dto;
import lombok.Data;
import java.util.List;
@Data
public class ExportParam {
/**
* 要导出的字段名列表
*/
private List<String> fieldNames;
/**
* 导出的文件名(不含扩展名)
*/
private String fileName;
/**
* 是否上传到OSS
*/
private Boolean uploadToOss = false;
/**
* OSS存储路径(如:exports/excel/)
*/
private String ossPath = "exports/excel/";
}
\ No newline at end of file
package com.yd.oss.feign.dto;
import lombok.Data;
@Data
public class ExportResult {
/**
* 导出是否成功
*/
private Boolean success;
/**
* 错误信息
*/
private String errorMsg;
/**
* 文件大小(字节)
*/
private Long fileSize;
/**
* OSS文件URL(如果上传到OSS)
*/
private String ossUrl;
/**
* 本地文件路径(如果不上传OSS)
*/
private String localFilePath;
public static ExportResult success(String ossUrl, Long fileSize) {
ExportResult result = new ExportResult();
result.setSuccess(true);
result.setOssUrl(ossUrl);
result.setFileSize(fileSize);
return result;
}
public static ExportResult error(String errorMsg) {
ExportResult result = new ExportResult();
result.setSuccess(false);
result.setErrorMsg(errorMsg);
return result;
}
}
\ No newline at end of file
...@@ -2,6 +2,8 @@ package com.yd.oss.feign.fallback; ...@@ -2,6 +2,8 @@ package com.yd.oss.feign.fallback;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiExcelFeignClient; import com.yd.oss.feign.client.ApiExcelFeignClient;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiExportRequest;
import com.yd.oss.feign.request.ApiOssExcelParseRequest; import com.yd.oss.feign.request.ApiOssExcelParseRequest;
import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest; import com.yd.oss.feign.request.ApiOssExportAppointmentExcelRequest;
import com.yd.oss.feign.response.ApiOssExcelParseResponse; import com.yd.oss.feign.response.ApiOssExcelParseResponse;
...@@ -32,6 +34,11 @@ public class ApiExcelFeignFallbackFactory implements FallbackFactory<ApiExcelFei ...@@ -32,6 +34,11 @@ public class ApiExcelFeignFallbackFactory implements FallbackFactory<ApiExcelFei
} }
@Override @Override
public Result<ExportResult> export(ApiExportRequest request) {
return null;
}
@Override
public Result<ImportResult> importExcel(MultipartFile file, Integer headerRow, public Result<ImportResult> importExcel(MultipartFile file, Integer headerRow,
Integer dataStartRow, String requiredFields) { Integer dataStartRow, String requiredFields) {
return null; return null;
......
package com.yd.oss.feign.request;
import com.yd.oss.feign.dto.ExportParam;
import lombok.Data;
import java.util.List;
@Data
public class ApiExportRequest {
/**
* 需要导出的数据列表
*/
private List<?> dataList;
/**
* 导出参数配置
*/
private ExportParam exportParam;
/**
* 实体类类型
*/
private Class<?> entityClass;
}
...@@ -102,8 +102,6 @@ ...@@ -102,8 +102,6 @@
<orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-buffer:4.1.69.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-transport:4.1.69.Final" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.60" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat:tomcat-annotations-api:9.0.60" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.2" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.2" level="project" />
</component> </component>
</module> </module>
\ No newline at end of file
...@@ -62,6 +62,18 @@ ...@@ -62,6 +62,18 @@
<artifactId>yd-auth-core</artifactId> <artifactId>yd-auth-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- 框架配置模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-framework</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Feign组件配置模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-feign</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 阿里云 OSS SDK --> <!-- 阿里云 OSS SDK -->
<dependency> <dependency>
......
package com.yd.oss.service.dto;
import lombok.Data;
/**
* 提供OSS上传文件返回的DTO
*/
@Data
public class OssUploadFileDto {
/**
* 文件元数据表业务ID唯一标识
*/
private String fileBizId;
/**
* 文件唯一标识
*/
private String fileKey;
/**
* 原始文件名
*/
private String originalName;
/**
* 完整的访问路径
*/
private String url;
}
package com.yd.oss.service.service;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import java.util.List;
public interface ExcelExportService {
ExportResult exportAndUploadToOss(List<?> dataList, ExportParam exportParam, Class<?> entityClass);
}
package com.yd.oss.service.service; package com.yd.oss.service.service;
import com.yd.oss.service.dto.FileMetadata; import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.UploadResult; import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.model.OssProvider; import com.yd.oss.service.model.OssProvider;
import java.io.InputStream; import java.io.InputStream;
...@@ -12,7 +13,7 @@ import java.time.Duration; ...@@ -12,7 +13,7 @@ import java.time.Duration;
public interface OssService { public interface OssService {
// 上传文件 // 上传文件
String uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser); OssUploadFileDto uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser,String type);
// 上传文件(使用默认存储桶) // 上传文件(使用默认存储桶)
String uploadFile(InputStream inputStream, String fileName, String uploadUser); String uploadFile(InputStream inputStream, String fileName, String uploadUser);
......
...@@ -7,8 +7,10 @@ import com.aliyun.oss.model.OSSObject; ...@@ -7,8 +7,10 @@ import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectRequest;
import com.yd.common.enums.CommonEnum; import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.IpUtil;
import com.yd.common.utils.RandomStringGenerator; import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.service.dto.FileMetadata; import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.UploadResult; import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.model.OssFile; import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.model.OssOperationLog; import com.yd.oss.service.model.OssOperationLog;
...@@ -16,6 +18,7 @@ import com.yd.oss.service.model.OssProvider; ...@@ -16,6 +18,7 @@ import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssFileService; import com.yd.oss.service.service.IOssFileService;
import com.yd.oss.service.service.IOssProviderService; import com.yd.oss.service.service.IOssProviderService;
import com.yd.oss.service.service.OssService; import com.yd.oss.service.service.OssService;
import com.yd.oss.service.utils.FileUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -57,14 +60,17 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -57,14 +60,17 @@ public class AliYunOssServiceImpl implements OssService {
/** /**
* 上传文件 * 上传文件
* @param inputStream * @param inputStream 文件流
* @param fileName * @param fileName 原始文件名
* @param bucketName * @param bucketName OSS桶名
* @param uploadUser * @param uploadUser 操作用户
* @param type oss文件夹分类目录类型,例:如果是.xls那就是excel/
* @return * @return
*/ */
@Override @Override
public String uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser) { public OssUploadFileDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser,String type) {
OssUploadFileDto ossUploadFileDto = new OssUploadFileDto();
long startTime = System.currentTimeMillis(); // 记录开始时间 long startTime = System.currentTimeMillis(); // 记录开始时间
String operationResult = "success"; // 操作结果 String operationResult = "success"; // 操作结果
String errorMessage = null; // 错误信息 String errorMessage = null; // 错误信息
...@@ -72,19 +78,19 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -72,19 +78,19 @@ public class AliYunOssServiceImpl implements OssService {
try { try {
// 读取输入流到字节数组 // 读取输入流到字节数组
byte[] fileData = readInputStreamToBytes(inputStream); byte[] fileData = FileUtil.readInputStreamToBytes(inputStream);
long fileSize = fileData.length; long fileSize = fileData.length;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key // 生成文件key
String fileKey = generateFileKey(fileName); String fileKey = FileUtil.generateFileKey(fileName,type);
String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket; String actualBucket = StringUtils.isNotBlank(bucketName) ? bucketName : defaultBucket;
String fileType = getFileType(fileName); String fileType = FileUtil.getFileType(fileName);
// 创建上传请求 // 创建上传请求
ObjectMetadata metadata = new ObjectMetadata(); ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileSize); metadata.setContentLength(fileSize);
metadata.setContentType(getContentType(fileType)); metadata.setContentType(FileUtil.getContentType(fileType));
// 设置公共读权限(如果需要) // 设置公共读权限(如果需要)
// metadata.setObjectAcl(CannedAccessControlList.PublicRead); // metadata.setObjectAcl(CannedAccessControlList.PublicRead);
...@@ -115,14 +121,20 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -115,14 +121,20 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser(uploadUser); operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog); ossFileService.saveOperationLog(operationLog);
log.info("文件上传成功: {} -> {}/{}", fileName, actualBucket, fileKey); log.info("文件上传成功: {} -> {}/{}", fileName, actualBucket, fileKey);
return fileKey;
ossUploadFileDto.setFileBizId(ossFile.getFileBizId());
ossUploadFileDto.setFileKey(fileKey);
ossUploadFileDto.setOriginalName(fileName);
// 如果设置了公共读,可以直接拼接URL
String publicUrl = "https://" + actualBucket + "." + defaultEndpoint + "/" + fileKey;
ossUploadFileDto.setUrl(publicUrl);
return ossUploadFileDto;
} catch (Exception e) { } catch (Exception e) {
operationResult = "failure"; // 标记操作失败 operationResult = "failure"; // 标记操作失败
errorMessage = e.getMessage(); // 记录错误信息 errorMessage = e.getMessage(); // 记录错误信息
...@@ -130,7 +142,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -130,7 +142,7 @@ public class AliYunOssServiceImpl implements OssService {
throw new RuntimeException("阿里云OSS上传文件失败: " + fileName, e); throw new RuntimeException("阿里云OSS上传文件失败: " + fileName, e);
} finally { } finally {
// 关闭资源 // 关闭资源
closeQuietly(inputStream); FileUtil.closeQuietly(inputStream);
// 记录失败日志 // 记录失败日志
if ("failure".equals(operationResult)) { if ("failure".equals(operationResult)) {
...@@ -144,7 +156,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -144,7 +156,7 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser(uploadUser); operationLog.setOperationUser(uploadUser);
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
...@@ -163,7 +175,8 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -163,7 +175,8 @@ public class AliYunOssServiceImpl implements OssService {
@Override @Override
public String uploadFile(InputStream inputStream, String fileName, String uploadUser) { public String uploadFile(InputStream inputStream, String fileName, String uploadUser) {
// 调用重载方法,使用默认存储桶 // 调用重载方法,使用默认存储桶
return uploadFile(inputStream, fileName, defaultBucket, uploadUser); // return uploadFile(inputStream, fileName, defaultBucket, uploadUser);
return null;
} }
/** /**
...@@ -197,7 +210,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -197,7 +210,7 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser("system"); // 系统操作 operationLog.setOperationUser("system"); // 系统操作
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
...@@ -223,7 +236,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -223,7 +236,7 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser("system"); operationLog.setOperationUser("system");
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
...@@ -277,7 +290,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -277,7 +290,7 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser(operator); operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
...@@ -303,7 +316,7 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -303,7 +316,7 @@ public class AliYunOssServiceImpl implements OssService {
operationLog.setOperationUser(operator); operationLog.setOperationUser(operator);
operationLog.setOperationResult(operationResult); operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage); operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(getClientIp()); operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime); operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库 // 保存操作日志到数据库
...@@ -472,7 +485,10 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -472,7 +485,10 @@ public class AliYunOssServiceImpl implements OssService {
} }
} }
// 切换到指定的OSS提供商 /**
* 切换到指定的OSS提供商
* @param provider
*/
private void switchToProvider(OssProvider provider) { private void switchToProvider(OssProvider provider) {
// 关闭旧的客户端 // 关闭旧的客户端
if (this.ossClient != null) { if (this.ossClient != null) {
...@@ -554,162 +570,6 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -554,162 +570,6 @@ public class AliYunOssServiceImpl implements OssService {
} }
/** /**
* 生成文件key(唯一标识)
* @param originalFileName
* @return
*/
private String generateFileKey(String originalFileName) {
// 提取文件扩展名
String fileExtension = originalFileName.contains(".") ?
originalFileName.substring(originalFileName.lastIndexOf(".")) : "";
// 生成唯一文件key:日期目录 + UUID + 扩展名
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/")) +
UUID.randomUUID().toString().replace("-", "") + fileExtension;
}
/**
* 获取输入流大小
* @param inputStream
* @return
* @throws IOException
*/
private Long getInputStreamSize(InputStream inputStream) throws IOException {
if (inputStream instanceof ByteArrayInputStream) {
// 如果是ByteArrayInputStream,直接获取可用字节数
return (long) inputStream.available();
}
// 对于其他类型的流,需要读取并计算大小
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
long size = 0;
while ((len = inputStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
size += len;
}
return size;
}
/**
* 读取输入流到字节数组
* @param inputStream
* @return
* @throws IOException
*/
private byte[] readInputStreamToBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
/**
* 重置输入流
* @param originalStream
* @param size
* @return
* @throws IOException
*/
private InputStream resetInputStream(InputStream originalStream, long size) throws IOException {
if (originalStream instanceof ByteArrayInputStream) {
// 如果是ByteArrayInputStream,可以直接重置
((ByteArrayInputStream) originalStream).reset();
return originalStream;
}
// 对于其他类型的流,需要重新创建
// 注意:这里简化处理,实际应用中可能需要更复杂的逻辑
byte[] data = new byte[(int) size];
try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
return bais;
}
}
/**
* 获取文件类型(扩展名)
* @param fileName
* @return
*/
private String getFileType(String fileName) {
return fileName.contains(".") ?
fileName.substring(fileName.lastIndexOf(".") + 1) : "";
}
/**
* 根据文件类型获取内容类型
* @param fileType
* @return
*/
private String getContentType(String fileType) {
switch (fileType.toLowerCase()) {
case "jpg":
case "jpeg":
return "image/jpeg";
case "png":
return "image/png";
case "gif":
return "image/gif";
case "pdf":
return "application/pdf";
case "txt":
return "text/plain";
case "html":
return "text/html";
case "css":
return "text/css";
case "js":
return "application/javascript";
default:
return "application/octet-stream";
}
}
/**
* 获取客户端IP
* @return
*/
private String getClientIp() {
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
} catch (Exception e) {
return "unknown";
}
}
/**
* 安静关闭资源
* @param closeable
*/
private void closeQuietly(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
// 安静关闭,忽略异常
}
}
}
/**
* 创建虚拟文件记录(用于操作日志) * 创建虚拟文件记录(用于操作日志)
* @return * @return
*/ */
...@@ -719,7 +579,6 @@ public class AliYunOssServiceImpl implements OssService { ...@@ -719,7 +579,6 @@ public class AliYunOssServiceImpl implements OssService {
return file; return file;
} }
/** /**
* 上传字节数组到OSS并设置为公共读权限 * 上传字节数组到OSS并设置为公共读权限
* @param content 文件内容字节数组 * @param content 文件内容字节数组
......
package com.yd.oss.service.service.impl;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.service.ExcelExportService;
import com.yd.oss.service.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* excel导出实现类
*/
@Slf4j
@Service
public class ExcelExportServiceImpl implements ExcelExportService {
// 注入OSS服务,用于文件上传
@Autowired
private OssService ossService;
/**
* 导出Excel并上传到OSS
* @param dataList 需要导出的数据列表
* @param exportParam 导出参数配置
* @param entityClass 实体类类型
* @return 导出结果
*/
@Override
public ExportResult exportAndUploadToOss(List<?> dataList, ExportParam exportParam, Class<?> entityClass) {
// 声明输出流和工作簿变量,用于后续资源关闭
ByteArrayOutputStream outputStream = null;
Workbook workbook = null;
try {
// 根据实体类字段和导出参数构建Excel导出列配置
List<ExcelExportEntity> entityList = buildExportEntities(exportParam.getFieldNames(), entityClass);
// 将数据列表转换为Map结构,便于EasyPOI处理
List<Map<String, Object>> dataMapList = buildDataMapList(dataList, exportParam.getFieldNames(), entityClass);
// 创建字节数组输出流,用于将Excel数据写入内存
outputStream = new ByteArrayOutputStream();
// 设置导出参数:无标题、工作表名称为sheet1、使用XSSF格式(支持.xlsx)
ExportParams params = new ExportParams(null, "sheet1", ExcelType.XSSF);
// 使用EasyPOI导出Excel到工作簿
workbook = ExcelExportUtil.exportExcel(params, entityList, dataMapList);
// 将工作簿内容写入输出流
workbook.write(outputStream);
// 获取Excel文件的字节数组和文件大小
byte[] excelBytes = outputStream.toByteArray();
long fileSize = excelBytes.length;
// 根据参数决定是否上传到OSS
if (Boolean.TRUE.equals(exportParam.getUploadToOss())) {
// 将字节数组转换为输入流,供OSS上传使用
ByteArrayInputStream inputStream = new ByteArrayInputStream(excelBytes);
// 生成包含时间戳的文件名,避免重复
String fileName = generateExcelFileName(exportParam.getFileName());
// 调用OSS服务上传文件到云端存储
OssUploadFileDto uploadResult = ossService.uploadFile(
inputStream, // Excel文件输入流
fileName, // 生成的文件名
"", // 存储桶名称(空字符串表示使用默认存储桶)
"", // 上传用户标识(空字符串表示匿名或系统用户)
"excel" // 文件分类类型,对应OSS文件夹目录
);
// 返回成功结果,包含文件URL和大小信息
return ExportResult.success(uploadResult.getUrl(), fileSize);
} else {
// 如果不需要上传到OSS,仅返回文件大小信息
return ExportResult.success(null, fileSize);
}
} catch (Exception e) {
// 打印异常堆栈,便于调试和问题排查
e.printStackTrace();
// 返回错误结果,包含异常信息
return ExportResult.error("导出失败: " + e.getMessage());
} finally {
// 资源清理块,确保工作簿和输出流正确关闭
try {
// 关闭工作簿,释放内存资源
if (workbook != null) {
workbook.close();
}
// 关闭输出流,释放系统资源
if (outputStream != null) {
outputStream.close();
}
} catch (Exception e) {
// 打印资源关闭时的异常信息
e.printStackTrace();
}
}
}
/**
* 生成Excel文件名(包含时间戳)
* @param baseName 基础文件名
* @return 生成的文件名
*/
private String generateExcelFileName(String baseName) {
// 如果基础文件名为空,使用默认文件名
if (StringUtils.isBlank(baseName)) {
baseName = "export_data";
}
// 去除已有文件扩展名,确保统一使用.xlsx格式
if (baseName.contains(".")) {
baseName = baseName.substring(0, baseName.lastIndexOf('.'));
}
// 生成时间戳,格式为年月日_时分秒
String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss"));
// 组合基础文件名、时间戳和文件扩展名
return baseName + "_" + timestamp + ".xlsx";
}
/**
* 构建导出列实体配置
* @param fieldNames 字段名称列表
* @param entityClass 实体类类型
* @return Excel导出列配置列表
*/
private List<ExcelExportEntity> buildExportEntities(List<String> fieldNames, Class<?> entityClass) {
// 创建导出列配置列表
List<ExcelExportEntity> entityList = new ArrayList<>();
// 获取实体类字段的注解映射(字段名->Excel列名)
Map<String, String> fieldAnnotationMap = getFieldAnnotations(entityClass);
// 遍历所有需要导出的字段
for (String fieldName : fieldNames) {
// 检查字段是否存在于注解映射中
if (fieldAnnotationMap.containsKey(fieldName)) {
// 创建Excel导出列实体:参数1为Excel列标题,参数2为实体字段名
ExcelExportEntity entity = new ExcelExportEntity(fieldAnnotationMap.get(fieldName), fieldName);
// 将列配置添加到列表
entityList.add(entity);
}
}
return entityList;
}
/**
* 获取字段注解映射(字段名->Excel列名)
* @param entityClass 实体类类型
* @return 字段注解映射表
*/
private Map<String, String> getFieldAnnotations(Class<?> entityClass) {
// 创建字段注解映射表
Map<String, String> fieldAnnotationMap = new HashMap<>();
// 获取实体类声明的所有字段
Field[] fields = entityClass.getDeclaredFields();
// 遍历所有字段
for (Field field : fields) {
// 获取字段上的Excel注解配置
cn.afterturn.easypoi.excel.annotation.Excel excelAnnotation =
field.getAnnotation(cn.afterturn.easypoi.excel.annotation.Excel.class);
// 如果字段有Excel注解,记录映射关系
if (excelAnnotation != null) {
// key: 字段名, value: Excel列名
fieldAnnotationMap.put(field.getName(), excelAnnotation.name());
}
}
return fieldAnnotationMap;
}
/**
* 构建数据Map列表,将对象列表转换为EasyPOI所需的Map结构
* @param dataList 数据对象列表
* @param fieldNames 需要导出的字段名称列表
* @param entityClass 实体类类型
* @return 数据Map列表
*/
private List<Map<String, Object>> buildDataMapList(List<?> dataList, List<String> fieldNames, Class<?> entityClass) {
// 创建数据Map列表
List<Map<String, Object>> dataMapList = new ArrayList<>();
// 遍历数据列表中的每个对象
for (Object data : dataList) {
// 为每个对象创建字段-值的映射
Map<String, Object> map = new HashMap<>();
// 遍历所有需要导出的字段
for (String fieldName : fieldNames) {
try {
// 通过反射获取字段对象
Field field = entityClass.getDeclaredField(fieldName);
// 设置字段可访问(突破private限制)
field.setAccessible(true);
// 将字段值放入Map,key为字段名,value为字段值
map.put(fieldName, field.get(data));
} catch (Exception e) {
// 如果获取字段值失败,设置为空字符串
map.put(fieldName, "");
}
}
// 将当前对象的字段映射添加到列表
dataMapList.add(map);
}
return dataMapList;
}
}
\ No newline at end of file
package com.yd.oss.service.utils;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
/**
* 文件工具类
*/
public class FileUtil {
/**
* 获取文件类型(扩展名)
* @param fileName
* @return
*/
public static String getFileType(String fileName) {
return fileName.contains(".") ?
fileName.substring(fileName.lastIndexOf(".") + 1) : "";
}
/**
* 重置输入流
* @param originalStream
* @param size
* @return
* @throws IOException
*/
public static InputStream resetInputStream(InputStream originalStream, long size) throws IOException {
if (originalStream instanceof ByteArrayInputStream) {
// 如果是ByteArrayInputStream,可以直接重置
((ByteArrayInputStream) originalStream).reset();
return originalStream;
}
// 对于其他类型的流,需要重新创建
// 注意:这里简化处理,实际应用中可能需要更复杂的逻辑
byte[] data = new byte[(int) size];
try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
return bais;
}
}
/**
* 安静关闭资源
* @param closeable
*/
public static void closeQuietly(Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
// 安静关闭,忽略异常
}
}
}
/**
* 读取输入流到字节数组
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStreamToBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
/**
* 获取输入流大小
* @param inputStream
* @return
* @throws IOException
*/
public static Long getInputStreamSize(InputStream inputStream) throws IOException {
if (inputStream instanceof ByteArrayInputStream) {
// 如果是ByteArrayInputStream,直接获取可用字节数
return (long) inputStream.available();
}
// 对于其他类型的流,需要读取并计算大小
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
long size = 0;
while ((len = inputStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
size += len;
}
return size;
}
/**
* 生成文件key(唯一标识)
* @param originalFileName 原始文件名
* @param type oss文件夹分类目录类型,例:如果是.xls那就是excel/
* @return
*/
public static String generateFileKey(String originalFileName,String type) {
// 提取文件扩展名
String fileExtension = originalFileName.contains(".") ?
originalFileName.substring(originalFileName.lastIndexOf(".")) : "";
// 生成唯一文件key:日期目录 + UUID + 扩展名
return type + "/" +LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd/")) +
UUID.randomUUID().toString().replace("-", "") + fileExtension;
}
/**
* 根据文件类型获取内容类型
* @param fileType 文件扩展名(不含点)
* @return MIME类型
*/
public static String getContentType(String fileType) {
if (fileType == null || fileType.trim().isEmpty()) {
return "application/octet-stream";
}
String lowerFileType = fileType.toLowerCase();
switch (lowerFileType) {
// 图像类型
case "jpg":
case "jpeg":
return "image/jpeg";
case "png":
return "image/png";
case "gif":
return "image/gif";
case "bmp":
return "image/bmp";
case "webp":
return "image/webp";
case "svg":
return "image/svg+xml";
case "ico":
return "image/x-icon";
case "tiff":
case "tif":
return "image/tiff";
case "psd":
return "image/vnd.adobe.photoshop";
// 文档类型
case "pdf":
return "application/pdf";
case "doc":
return "application/msword";
case "docx":
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
case "xls":
return "application/vnd.ms-excel";
case "xlsx":
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
case "ppt":
return "application/vnd.ms-powerpoint";
case "pptx":
return "application/vnd.openxmlformats-officedocument.presentationml.presentation";
case "csv":
return "text/csv";
case "rtf":
return "application/rtf";
case "odt":
return "application/vnd.oasis.opendocument.text";
case "ods":
return "application/vnd.oasis.opendocument.spreadsheet";
case "odp":
return "application/vnd.oasis.opendocument.presentation";
// 文本类型
case "txt":
return "text/plain";
case "html":
case "htm":
return "text/html";
case "css":
return "text/css";
case "xml":
return "application/xml";
case "json":
return "application/json";
case "js":
return "application/javascript";
case "md":
return "text/markdown";
case "log":
return "text/plain";
// 压缩文件类型
case "zip":
return "application/zip";
case "rar":
return "application/vnd.rar";
case "7z":
return "application/x-7z-compressed";
case "tar":
return "application/x-tar";
case "gz":
return "application/gzip";
// 音频类型
case "mp3":
return "audio/mpeg";
case "wav":
return "audio/wav";
case "ogg":
return "audio/ogg";
case "flac":
return "audio/flac";
case "aac":
return "audio/aac";
case "m4a":
return "audio/mp4";
case "wma":
return "audio/x-ms-wma";
// 视频类型
case "mp4":
return "video/mp4";
case "avi":
return "video/x-msvideo";
case "mov":
return "video/quicktime";
case "wmv":
return "video/x-ms-wmv";
case "flv":
return "video/x-flv";
case "webm":
return "video/webm";
case "mkv":
return "video/x-matroska";
case "mpeg":
case "mpg":
return "video/mpeg";
case "3gp":
return "video/3gpp";
// 字体类型
case "ttf":
return "font/ttf";
case "otf":
return "font/otf";
case "woff":
return "font/woff";
case "woff2":
return "font/woff2";
case "eot":
return "application/vnd.ms-fontobject";
// 编程文件类型
case "java":
return "text/x-java-source";
case "py":
return "text/x-python";
case "php":
return "application/x-httpd-php";
case "cpp":
case "c++":
return "text/x-c++";
case "c":
return "text/x-c";
case "h":
return "text/x-c-header";
case "cs":
return "text/x-csharp";
case "go":
return "text/x-go";
case "rb":
return "text/x-ruby";
case "pl":
return "text/x-perl";
case "sh":
return "application/x-sh";
case "bat":
return "application/x-msdownload";
case "ps1":
return "application/x-powershell";
// 数据文件类型
case "sql":
return "application/sql";
case "db":
case "sqlite":
return "application/x-sqlite3";
case "dbf":
return "application/x-dbf";
// 电子书类型
case "epub":
return "application/epub+zip";
case "mobi":
return "application/x-mobipocket-ebook";
case "azw":
return "application/vnd.amazon.ebook";
// CAD文件类型
case "dwg":
return "image/vnd.dwg";
case "dxf":
return "image/vnd.dxf";
// 其他常见类型
case "exe":
return "application/x-msdownload";
case "dll":
return "application/x-msdownload";
case "apk":
return "application/vnd.android.package-archive";
case "ipa":
return "application/x-itunes-ipa";
case "deb":
return "application/x-deb";
case "rpm":
return "application/x-rpm";
case "iso":
return "application/x-iso9660-image";
case "swf":
return "application/x-shockwave-flash";
case "ps":
return "application/postscript";
case "ai":
return "application/postscript";
case "eps":
return "application/postscript";
default:
return "application/octet-stream";
}
}
}
...@@ -50,15 +50,6 @@ ...@@ -50,15 +50,6 @@
<orderEntry type="library" name="Maven: p6spy:p6spy:3.9.1" level="project" /> <orderEntry type="library" name="Maven: p6spy:p6spy:3.9.1" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.31" level="project" /> <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.31" level="project" />
<orderEntry type="module" module-name="yd-oss-feign" /> <orderEntry type="module" module-name="yd-oss-feign" />
<orderEntry type="library" name="Maven: com.yd:yd-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.1.1" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3.3" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:11.8" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:11.8" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-common:1.0-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: com.yd:yd-common:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83" level="project" /> <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.83" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.6.6" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-validation:2.6.6" level="project" />
...@@ -94,14 +85,12 @@ ...@@ -94,14 +85,12 @@
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.5" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpasyncclient:4.1.5" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.15" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.15" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.4.2" level="project" /> <orderEntry type="library" name="Maven: com.alibaba.nacos:nacos-api:1.4.2" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.2" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.12.0" level="project" /> <orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.12.0" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel:0.12.0" level="project" /> <orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel:0.12.0" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_common:0.12.0" level="project" /> <orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_common:0.12.0" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel_agent:0.12.0" level="project" /> <orderEntry type="library" name="Maven: io.prometheus:simpleclient_tracer_otel_agent:0.12.0" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.11" level="project" /> <orderEntry type="library" name="Maven: com.alibaba.spring:spring-context-support:1.0.11" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.1.1" level="project" /> <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.1.1" level="project" /> <orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.1.1" level="project" />
<orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0" level="project" /> <orderEntry type="library" name="Maven: com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2021.0.1.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.6.6" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.6.6" level="project" />
...@@ -123,7 +112,6 @@ ...@@ -123,7 +112,6 @@
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-resource-server:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-resource-server:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-core:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-jose:5.6.2" level="project" /> <orderEntry type="library" name="Maven: org.springframework.security:spring-security-oauth2-jose:5.6.2" level="project" />
<orderEntry type="library" name="Maven: com.nimbusds:nimbus-jose-jwt:9.14" level="project" /> <orderEntry type="library" name="Maven: com.nimbusds:nimbus-jose-jwt:9.14" level="project" />
...@@ -150,6 +138,10 @@ ...@@ -150,6 +138,10 @@
<orderEntry type="library" name="Maven: com.yd:yd-framework:1.0-SNAPSHOT" level="project" /> <orderEntry type="library" name="Maven: com.yd:yd-framework:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.6.6" level="project" /> <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.6.6" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" /> <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.16" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.6.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.redisson:redisson:3.20.0" level="project" /> <orderEntry type="library" name="Maven: org.redisson:redisson:3.20.0" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-common:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-common:4.1.69.Final" level="project" />
<orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" /> <orderEntry type="library" name="Maven: io.netty:netty-codec:4.1.69.Final" level="project" />
...@@ -168,9 +160,18 @@ ...@@ -168,9 +160,18 @@
<orderEntry type="library" name="Maven: org.objenesis:objenesis:3.3" level="project" /> <orderEntry type="library" name="Maven: org.objenesis:objenesis:3.3" level="project" />
<orderEntry type="library" name="Maven: com.esotericsoftware:minlog:1.3.1" level="project" /> <orderEntry type="library" name="Maven: com.esotericsoftware:minlog:1.3.1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.2" level="project" />
<orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.11.22" level="project" /> <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.11.22" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.1.6" level="project" /> <orderEntry type="library" name="Maven: org.jodd:jodd-bean:5.1.6" level="project" />
<orderEntry type="library" name="Maven: org.jodd:jodd-core:5.1.6" level="project" /> <orderEntry type="library" name="Maven: org.jodd:jodd-core:5.1.6" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.1.1" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3.3" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:11.8" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:11.8" level="project" />
<orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.15.1" level="project" /> <orderEntry type="library" name="Maven: com.aliyun.oss:aliyun-sdk-oss:3.15.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" /> <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.15" level="project" />
...@@ -229,7 +230,6 @@ ...@@ -229,7 +230,6 @@
<orderEntry type="library" name="Maven: cn.afterturn:easypoi-web:4.4.0" level="project" /> <orderEntry type="library" name="Maven: cn.afterturn:easypoi-web:4.4.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.18" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.18" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.18" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.18" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.18" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.18" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.18" level="project" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment