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 到对象存储服务,并保存文件信息到数据库 *