diff --git a/ruoyi-api/pom.xml b/ruoyi-api/pom.xml
index 8b5f0b9..e276c9a 100644
--- a/ruoyi-api/pom.xml
+++ b/ruoyi-api/pom.xml
@@ -13,6 +13,7 @@
ruoyi-api-system
ruoyi-api-resource
ruoyi-api-workflow
+ property-api
ruoyi-api
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
index 2204de6..182ca62 100644
--- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
@@ -1,8 +1,10 @@
package org.dromara.resource.api;
+import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.resource.api.domain.RemoteFile;
+import java.io.IOException;
import java.util.List;
/**
@@ -35,4 +37,12 @@ public interface RemoteFileService {
* @return 列表
*/
List selectByIds(String ossIds);
+
+ /**
+ * 文件下载方法,支持一次性下载完整文件
+ *
+ * @param ossId OSS对象ID
+ * @return byte[] 返回下载的字节数组
+ */
+ byte[] downloadToByteArray(Long ossId) throws IOException;
}
diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
index 5ce7c5a..fb6452f 100644
--- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
+++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
@@ -1,9 +1,11 @@
package org.dromara.resource.api;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.resource.api.domain.RemoteFile;
+import java.io.IOException;
import java.util.List;
/**
@@ -50,4 +52,14 @@ public class RemoteFileServiceMock implements RemoteFileService {
return List.of();
}
+ /**
+ * 文件下载方法,支持一次性下载完整文件
+ *
+ * @param ossId OSS对象ID
+ * @return byte[] 返回下载的字节数组
+ */
+ public byte[] downloadToByteArray(Long ossId) throws IOException {
+ log.warn("服务调用异常 -> 降级处理");
+ return new byte[0];
+ }
}
diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
index 99bc294..f5d6d13 100644
--- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
+++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
@@ -265,6 +265,37 @@ public class OssClient {
}
}
+ /**
+ * 下载文件从 Amazon S3 到 byte[]
+ *
+ * @param key 文件在 Amazon S3 中的对象键
+ * @return byte[] 返回下载的字节数组
+ * @throws OssException 如果下载失败,抛出自定义异常
+ */
+ public byte[] downloadToByteArray(String key) {
+ try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+ // 构建下载请求
+ DownloadRequest> downloadRequest = DownloadRequest.builder()
+ // 文件对象
+ .getObjectRequest(y -> y.bucket(properties.getBucketName())
+ .key(key)
+ .build())
+ .addTransferListener(LoggingTransferListener.create())
+ // 使用订阅转换器
+ .responseTransformer(AsyncResponseTransformer.toBlockingInputStream())
+ .build();
+ // 使用 S3TransferManager 下载文件
+ Download> responseFuture = transferManager.download(downloadRequest);
+ // 输出到流中
+ try (ResponseInputStream responseStream = responseFuture.completionFuture().join().result()) { // auto-closeable stream
+ responseStream.transferTo(out); // 阻塞调用线程 blocks the calling thread
+ }
+ return out.toByteArray();
+ } catch (Exception e) {
+ throw new OssException("文件下载失败,错误信息:[" + e.getMessage() + "]");
+ }
+ }
+
/**
* 删除云存储服务中指定路径下文件
*
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java
index 09015a2..e72e57a 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisDeviceManage.java
@@ -68,11 +68,6 @@ public class SisDeviceManage extends BaseEntity {
*/
private Integer vcrPort;
- /**
- * 门禁id
- */
- private Long accessControlId;
-
/**
* 设备账号
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
index 0332d13..0dc26c9 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
@@ -39,9 +39,9 @@ public class SisPersonLibImg extends TenantEntity {
private String imgName;
/**
- * 图片的存储地址
+ * 图片ossId
*/
- private String imgUrl;
+ private Long imgOssId;
/**
* 性别 1:男 2:女 99:未说明
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java
index 7ae514e..cc1d0f3 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisDeviceManageBo.java
@@ -66,11 +66,6 @@ public class SisDeviceManageBo extends BaseEntity {
*/
private Long vcrPort;
- /**
- * 门禁id
- */
- private Long accessControlId;
-
/**
* 设备账号
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
index fb586c1..e326fcb 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
@@ -39,10 +39,10 @@ public class SisPersonLibImgBo extends BaseEntity {
private String imgName;
/**
- * 图片的存储地址
+ * 图片ossId
*/
- @NotBlank(message = "图片的存储地址不能为空", groups = {AddGroup.class, EditGroup.class})
- private String imgUrl;
+ @NotBlank(message = "图片ossId不能为空", groups = {AddGroup.class, EditGroup.class})
+ private String imgOssId;
/**
* 性别 1:男2:女 99:未说明
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java
index 7b4c4ea..fd1c616 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java
@@ -73,12 +73,6 @@ public class SisDeviceManageVo implements Serializable {
@ExcelProperty(value = "录像机端口")
private Integer vcrPort;
- /**
- * 门禁id
- */
- @ExcelProperty(value = "门禁id")
- private Long accessControlId;
-
/**
* 设备账号
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
index 8a3a39d..14c1c73 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
@@ -45,10 +45,10 @@ public class SisPersonLibImgVo implements Serializable {
private String imgName;
/**
- * 图片的存储地址
+ * 图片ossId
*/
- @ExcelProperty(value = "图片的存储地址")
- private String imgUrl;
+ @ExcelProperty(value = "图片ossId")
+ private Long imgOssId;
/**
* 性别 1:男
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java
index 6f4f07d..ceb910a 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java
@@ -4,11 +4,14 @@ import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.resource.api.RemoteFileService;
import org.dromara.sis.domain.SisAuthRecord;
import org.dromara.sis.domain.bo.SingleAuthRecordBo;
import org.dromara.sis.domain.bo.SisAuthRecordBo;
@@ -57,6 +60,9 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
private final ISisLibDeviceImgRefService sisLibDeviceImgRefService;
private final ISisAccessControlDeviceService sisAccessControlDeviceService;
+ @DubboReference
+ private final RemoteFileService remoteFileService;
+
/**
* 查询授权记录
*
@@ -142,14 +148,18 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
List acList = sisAccessControlService.queryListByIds(bo.getAcIds());
Assert.notEmpty(acList, "门禁设备不存在!");
+
+
try {
log.info("开始对宇视盒子下发照片,图片:{}、设备:{}", bo.getImgIds(), eqpIds);
-
for (SisPersonLibImgVo imgVo : imgList) {
for (Long eqpId : eqpIds) {
long eqp_lib_id;
Integer eqp_lib_img_id;
- byte[] imageByte = Files.readAllBytes(Paths.get(imgVo.getImgUrl()));
+
+ byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId());
+ Assert.notNull(imageByte, "图片下载失败");
+// byte[] imageByte = Files.readAllBytes(Paths.get(imgVo.getImgUrl()));
SisAccessControlDeviceVo vo = sisAccessControlDeviceService.queryById(eqpId);
Assert.notNull(vo, "门禁控制设备不存在,id=" + eqpId);
@@ -207,7 +217,8 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
log.info("开始写入E8平台,图片:{}、门禁:{}", bo.getImgIds(), bo.getAcIds());
for (SisPersonLibImgVo imgVo : imgList) {
- byte[] imageByte = Files.readAllBytes(Paths.get(imgVo.getImgUrl()));
+ byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId());
+ Assert.notNull(imageByte, "图片下载失败");
log.info("E8平台上传图片,{}", imgVo.getId());
String url = e8VouchService.uploadFace(imageByte);
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java
index 7b01fa2..1f5fff0 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceManageServiceImpl.java
@@ -81,7 +81,6 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService {
lqw.eq(bo.getParentId() != null, SisDeviceManage::getParentId, bo.getParentId());
lqw.eq(StringUtils.isNotBlank(bo.getVcrIp()), SisDeviceManage::getVcrIp, bo.getVcrIp());
lqw.eq(bo.getVcrPort() != null, SisDeviceManage::getVcrPort, bo.getVcrPort());
- lqw.eq(bo.getAccessControlId() != null, SisDeviceManage::getAccessControlId, bo.getAccessControlId());
return lqw;
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java
index 9d4ca82..466b232 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java
@@ -82,7 +82,7 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
lqw.orderByAsc(SisPersonLibImg::getId);
lqw.eq(bo.getLibId() != null, SisPersonLibImg::getLibId, bo.getLibId());
lqw.like(StringUtils.isNotBlank(bo.getImgName()), SisPersonLibImg::getImgName, bo.getImgName());
- lqw.eq(StringUtils.isNotBlank(bo.getImgUrl()), SisPersonLibImg::getImgUrl, bo.getImgUrl());
+ lqw.eq(bo.getImgOssId() != null, SisPersonLibImg::getImgOssId, bo.getImgOssId());
lqw.eq(bo.getSex() != null, SisPersonLibImg::getSex, bo.getSex());
lqw.eq(StringUtils.isNotBlank(bo.getEmail()), SisPersonLibImg::getEmail, bo.getEmail());
lqw.eq(StringUtils.isNotBlank(bo.getTel()), SisPersonLibImg::getTel, bo.getTel());
diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java
index dcdc9bd..bbaa357 100644
--- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java
+++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java
@@ -1,6 +1,7 @@
package org.dromara.resource.dubbo;
import cn.hutool.core.convert.Convert;
+import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
@@ -18,6 +19,7 @@ import org.dromara.resource.service.ISysOssService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import java.io.IOException;
import java.util.List;
/**
@@ -82,8 +84,18 @@ public class RemoteFileServiceImpl implements RemoteFileService {
* @return 列表
*/
@Override
- public List selectByIds(String ossIds){
+ public List selectByIds(String ossIds) {
List sysOssVos = sysOssService.listByIds(StringUtils.splitTo(ossIds, Convert::toLong));
return MapstructUtils.convert(sysOssVos, RemoteFile.class);
}
+
+ /**
+ * 文件下载方法,支持一次性下载完整文件
+ *
+ * @param ossId OSS对象ID
+ * @return byte[] 返回下载的字节数组
+ */
+ public byte[] downloadToByteArray(Long ossId) throws IOException {
+ return sysOssService.downloadToByteArray(ossId);
+ }
}
diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java
index c756cc4..76c545e 100644
--- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java
+++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/ISysOssService.java
@@ -92,4 +92,12 @@ public interface ISysOssService {
* @return 结果
*/
Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 文件下载方法,支持一次性下载完整文件
+ *
+ * @param ossId OSS对象ID
+ * @return byte[] 返回下载的字节数组
+ */
+ byte[] downloadToByteArray(Long ossId) throws IOException;
}
diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java
index 2f4a047..2e94612 100644
--- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java
+++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java
@@ -159,6 +159,24 @@ public class SysOssServiceImpl implements ISysOssService {
storage.download(sysOss.getFileName(), response.getOutputStream(), response::setContentLengthLong);
}
+ /**
+ * 文件下载方法,支持一次性下载完整文件
+ *
+ * @param ossId OSS对象ID
+ * @return byte[] 返回下载的字节数组
+ */
+ @Override
+ public byte[] downloadToByteArray(Long ossId) throws IOException {
+ SysOssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId);
+ if (ObjectUtil.isNull(sysOss)) {
+ throw new ServiceException("文件数据不存在!");
+ }
+// FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
+// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
+ OssClient storage = OssFactory.instance(sysOss.getService());
+ return storage.downloadToByteArray(sysOss.getFileName());
+ }
+
/**
* 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库
*