| | |
| | | package com.ruoyi.basic.utils; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageAttachmentVO; |
| | | import com.ruoyi.basic.dto.StorageBlobDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | |
| | | * @param storageBlobDTOS 文件信息 |
| | | */ |
| | | public void saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS) { |
| | | if (CollectionUtils.isEmpty(storageBlobDTOS)) { |
| | | throw new RuntimeException("文件信息不能为空"); |
| | | } |
| | | if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | |
| | | } |
| | | // 删除旧附件信息 |
| | | deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageBlobDTOS)) { |
| | | return; |
| | | } |
| | | List<StorageAttachment> storageAttachments = new ArrayList<>(); |
| | | for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) { |
| | | StorageAttachment storageAttachment = new StorageAttachment(); |
| | |
| | | storageAttachment.setRecordId(recordId); |
| | | storageAttachment.setStorageBlobId(storageBlobDTO.getId()); |
| | | storageAttachment.setDeleted(0L); |
| | | storageAttachments.add(storageAttachment); |
| | | } |
| | | storageAttachmentMapper.insert(storageAttachments); |
| | | } |
| | | |
| | | /** |
| | | * 保存附件信息 |
| | | * |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | * @param storageBlobDTOS 文件信息 |
| | | */ |
| | | public void saveStorageAttachmentByRecordTypeAndRecordId(String application,RecordTypeEnum recordType, Long recordId, List<StorageBlobDTO> storageBlobDTOS) { |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | if (recordId == null) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | |
| | | // 删除旧附件信息 |
| | | if (application == null) { |
| | | for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) { |
| | | deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.getByType(storageBlobDTO.getApplication()), recordType, recordId); |
| | | } |
| | | } else { |
| | | deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.getByType(application), recordType, recordId); |
| | | } |
| | | |
| | | if (CollectionUtils.isEmpty(storageBlobDTOS)) { |
| | | deleteStorageAttachmentsByRecordTypeAndRecordId(recordType, recordId); |
| | | } |
| | | |
| | | List<StorageAttachment> storageAttachments = new ArrayList<>(); |
| | | for (StorageBlobDTO storageBlobDTO : storageBlobDTOS) { |
| | | StorageAttachment storageAttachment = new StorageAttachment(); |
| | | storageAttachment.setApplication(Objects.requireNonNullElseGet(application, () -> ApplicationTypeEnum.getByType(storageBlobDTO.getApplication()).getType())); |
| | | storageAttachment.setRecordType(recordType.getType()); |
| | | storageAttachment.setRecordId(recordId); |
| | | storageAttachment.setStorageBlobId(storageBlobDTO.getId()); |
| | | storageAttachment.setDeleted(0L); |
| | | storageAttachments.add(storageAttachment); |
| | | } |
| | | storageAttachmentMapper.insert(storageAttachments); |
| | | } |
| | |
| | | * |
| | | * @param application 文件用途 |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | * @param recordIds 关联记录id |
| | | */ |
| | | public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds) { |
| | | if (recordIds == null || recordIds.isEmpty()) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (application == null) { |
| | |
| | | } |
| | | List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .eq(StorageAttachment::getRecordId, recordId) |
| | | .in(StorageAttachment::getRecordId, recordIds) |
| | | .eq(StorageAttachment::getApplication, application.getType())); |
| | | if (CollectionUtils.isNotEmpty(storageAttachments)) { |
| | | List<Long> storageAttachmentIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId) |
| | | .collect(Collectors.toList()); |
| | | deleteStorageBlobsByStorageAttachmentIds(storageAttachmentIds); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 通过关联记录类型、关联记录id删除文件信息 |
| | | * |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public void deleteStorageBlobsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .eq(StorageAttachment::getRecordId, recordId)); |
| | | if (CollectionUtils.isNotEmpty(storageAttachments)) { |
| | | List<Long> storageAttachmentIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId) |
| | | .collect(Collectors.toList()); |
| | |
| | | storageAttachmentMapper.deleteByIds(storageAttachmentIds); |
| | | } |
| | | |
| | | /** |
| | | * 删除文件关联信息 |
| | | * |
| | | * @param application 文件用途 |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(application, recordType, Arrays.asList(recordId)); |
| | | storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .eq(StorageAttachment::getRecordId, recordId) |
| | | .eq(StorageAttachment::getApplication, application.getType())); |
| | | } |
| | | |
| | | /** |
| | | * 删除文件关联信息 |
| | | * |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public void deleteStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | deleteStorageBlobsByRecordTypeAndRecordId(recordType, recordId); |
| | | storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .eq(StorageAttachment::getRecordId, recordId)); |
| | | } |
| | | |
| | | /** |
| | | * 批量删除文件关联信息 attachment |
| | | * |
| | | * @param application 文件用途 |
| | | * @param recordType 关联记录类型 |
| | | * @param recordIds 关联记录id |
| | | */ |
| | | public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum application, RecordTypeEnum recordType, List<Long> recordIds) { |
| | | if (recordIds == null || recordIds.isEmpty()) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | deleteStorageBlobsByApplicationAndRecordTypeAndRecordIds(application, recordType, recordIds); |
| | | storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .in(StorageAttachment::getRecordId, recordIds) |
| | | .eq(StorageAttachment::getApplication, application.getType())); |
| | | } |
| | | |
| | |
| | | throw new RuntimeException("文件id不能为空"); |
| | | } |
| | | return storageAttachmentMapper.selectByIds(storageAttachmentIds); |
| | | } |
| | | |
| | | /** |
| | | * 通过记录类型获取文件信息 attachment(分页) |
| | | * |
| | | * @param page 分页参数 |
| | | * @param storageAttachmentDTO 关联记录信息 |
| | | */ |
| | | public IPage<StorageAttachmentVO> getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(Page page, StorageAttachmentDTO storageAttachmentDTO) { |
| | | // 分页查询符合条件的 StorageAttachment 记录 |
| | | LambdaQueryWrapper<StorageAttachment> queryWrapper = new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, storageAttachmentDTO.getRecordType()) |
| | | .eq(StorageAttachment::getRecordId, storageAttachmentDTO.getRecordId()); |
| | | if (storageAttachmentDTO.getApplication() != null) { |
| | | queryWrapper.eq(StorageAttachment::getApplication, storageAttachmentDTO.getApplication()); |
| | | } |
| | | IPage<StorageAttachmentVO> storageAttachmentIPage = storageAttachmentMapper.selectPage(page, queryWrapper); |
| | | |
| | | // 转换为 StorageAttachmentVO 并获取对应的 StorageBlobVO |
| | | List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>(); |
| | | if (CollectionUtils.isNotEmpty(storageAttachmentIPage.getRecords())) { |
| | | for (StorageAttachment storageAttachment : storageAttachmentIPage.getRecords()) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | | storageAttachmentVO.setStorageBlobVOS(storageBlobVOS); |
| | | } |
| | | storageAttachmentVOS.add(storageAttachmentVO); |
| | | } |
| | | } |
| | | |
| | | // 构建分页结果 |
| | | IPage<StorageAttachmentVO> resultPage = new Page<>(); |
| | | BeanUtils.copyProperties(storageAttachmentIPage, resultPage); |
| | | resultPage.setRecords(storageAttachmentVOS); |
| | | |
| | | return resultPage; |
| | | } |
| | | |
| | | /** |
| | |
| | | * |
| | | * @param storageAttachmentIds 文件id |
| | | */ |
| | | public List<StorageBlobVO> getStorageBlobDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | public List<StorageBlobVO> getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return null; |
| | | } |
| | | List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); |
| | | List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); |
| | | List<StorageBlobVO> storageBlobDTOS = new ArrayList<>(); |
| | | for (StorageBlob storageBlob : storageBlobs) { |
| | | StorageBlobVO storageBlobVO = new StorageBlobVO(); |
| | | BeanUtils.copyProperties(storageBlob, storageBlobVO); |
| | | storageBlobVO.setPreviewURL(buildSignedPreviewUrl(storageBlobVO)); |
| | | storageBlobVO.setDownloadURL(buildSignedDownloadUrl(storageBlobVO)); |
| | | storageBlobDTOS.add(storageBlobVO); |
| | | } |
| | | return storageBlobDTOS; |
| | | } |
| | | |
| | | /** |
| | | * 通过文件用途、关联记录类型、关联记录id获取文件关联信息 attachment |
| | | * |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public List<StorageAttachment> getStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | return storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | | .eq(StorageAttachment::getRecordId, recordId)); |
| | | } |
| | | |
| | | /** |
| | | * 通过文件用途、关联记录类型、关联记录id获取文件信息 blob |
| | | * |
| | | * @param application 文件用途 |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return null; |
| | | } |
| | |
| | | /** |
| | | * 通过文件用途、关联记录类型、关联记录id获取文件信息 blob |
| | | * |
| | | * @param application 文件用途 |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public List<StorageBlobVO> getStorageBlobDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | public List<StorageBlobVO> getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByRecordTypeAndRecordId(recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return null; |
| | | } |
| | |
| | | * @param recordId 关联记录id |
| | | * @param expired 过期时间 |
| | | */ |
| | | public List<StorageBlobVO> getStorageBlobDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { |
| | | public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return null; |
| | |
| | | * @param storageAttachmentIds 文件id |
| | | * @param expired 过期时间 |
| | | */ |
| | | public List<StorageBlobVO> getStorageBlobDTOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { |
| | | public List<StorageBlobVO> getStorageBlobVOsByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByStorageAttachmentIds(storageAttachmentIds); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return null; |
| | |
| | | for (StorageAttachment storageAttachment : storageAttachments) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | |
| | | for (StorageAttachment storageAttachment : storageAttachments) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | |
| | | for (StorageAttachment storageAttachment : storageAttachments) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId())); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | |
| | | for (StorageAttachment storageAttachment : storageAttachments) { |
| | | StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO(); |
| | | BeanUtils.copyProperties(storageAttachment, storageAttachmentVO); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()), expired); |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | storageAttachmentVO.setStorageBlobVOS(new ArrayList<>()); |
| | | } else { |
| | |
| | | */ |
| | | public List<String> getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | List<String> res = new ArrayList<>(); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); |
| | | for (StorageBlobVO storageBlobVO : storageBlobVOS) { |
| | | res.add(buildSignedPreviewUrl(storageBlobVO)); |
| | | } |
| | |
| | | */ |
| | | public List<String> getFilePreviewURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { |
| | | List<String> res = new ArrayList<>(); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); |
| | | for (StorageBlobVO storageBlobVO : storageBlobVOS) { |
| | | res.add(buildSignedUrl(storageBlobVO, "/preview/", expired)); |
| | | } |
| | |
| | | */ |
| | | public List<String> getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | List<String> res = new ArrayList<>(); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); |
| | | for (StorageBlobVO storageBlobVO : storageBlobVOS) { |
| | | res.add(buildSignedDownloadUrl(storageBlobVO)); |
| | | } |
| | |
| | | */ |
| | | public List<String> getFileDownloadURLByStorageAttachmentIds(List<Long> storageAttachmentIds, BigDecimal expired) { |
| | | List<String> res = new ArrayList<>(); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobDTOsByStorageAttachmentIds(storageAttachmentIds); |
| | | List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(storageAttachmentIds); |
| | | for (StorageBlobVO storageBlobVO : storageBlobVOS) { |
| | | res.add(buildSignedUrl(storageBlobVO, "/download/", expired)); |
| | | } |
| | | return res; |
| | | } |
| | | |
| | | /** |
| | | * 通过文件关联id获取文件预览地址 |
| | | * |
| | | * @param application 应用 |
| | | * @param recordType 记录类型 |
| | | * @param recordId 记录id |
| | | */ |
| | | public List<String> getFilePreviewURLByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return getFilePreviewURLByStorageAttachmentIds(storageAttachments.stream().map(StorageAttachment::getId).collect(Collectors.toList())); |
| | | } |
| | | |
| | | /** |
| | | * 通过文件关联id获取文件预览地址存在过期时间 |
| | | * |
| | | * @param application 应用 |
| | | * @param recordType 记录类型 |
| | | * @param recordId 记录id |
| | | * @param expired 过期时间(分钟) |
| | | */ |
| | | public List<String> getFilePreviewURLByApplicationAndRecordTypeAndRecordIdAndExpired(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return getFilePreviewURLByStorageAttachmentIds(storageAttachments.stream().map(StorageAttachment::getId).collect(Collectors.toList()), expired); |
| | | } |
| | | |
| | | /** |
| | | * 通过文件关联id获取文件下载地址 |
| | | * |
| | | * @param application 应用 |
| | | * @param recordType 记录类型 |
| | | * @param recordId 记录id |
| | | */ |
| | | public List<String> getFileDownloadURLByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return getFileDownloadURLByStorageAttachmentIds(storageAttachments.stream().map(StorageAttachment::getId).collect(Collectors.toList())); |
| | | } |
| | | |
| | | /** |
| | | * 通过文件关联id获取文件下载地址存在过期时间 |
| | | * |
| | | * @param application 应用 |
| | | * @param recordType 记录类型 |
| | | * @param recordId 记录id |
| | | * @param expired 过期时间(分钟) |
| | | */ |
| | | public List<String> getFileDownloadURLByApplicationAndRecordTypeAndRecordIdAndExpired(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | return getFileDownloadURLByStorageAttachmentIds(storageAttachments.stream().map(StorageAttachment::getId).collect(Collectors.toList()), expired); |
| | | } |
| | | |
| | | public String buildSignedPreviewUrl(StorageBlobVO storageBlob) { |
| | |
| | | if (storageBlob == null || !StringUtils.hasText(storageBlob.getUidFilename())) { |
| | | throw new IllegalArgumentException("文件信息不完整"); |
| | | } |
| | | String domain = StringUtils.trimTrailingCharacter(properties.getDomain(), '/'); |
| | | String prefix = properties.getUrlPrefix().startsWith("/") ? properties.getUrlPrefix() : "/" + properties.getUrlPrefix(); |
| | | String normalizedActionPath = StringUtils.hasText(actionPath) ? actionPath : "/preview/"; |
| | | if (!normalizedActionPath.startsWith("/")) { |
| | | normalizedActionPath = "/" + normalizedActionPath; |
| | | } |
| | | if (!normalizedActionPath.endsWith("/")) { |
| | | normalizedActionPath = normalizedActionPath + "/"; |
| | | } |
| | | String baseUrl = domain + prefix + normalizedActionPath + storageBlob.getUidFilename(); |
| | | |
| | | // -1 表示永久有效,不生成 token,改为 publicKey 组合校验 |
| | | if (expired != null && BigDecimal.valueOf(-1L).compareTo(expired) == 0) { |
| | | if (!StringUtils.hasText(storageBlob.getResourceKey())) { |
| | | throw new IllegalArgumentException("公开链接缺少publicKey"); |
| | | } |
| | | return baseUrl + "?publicKey=" + storageBlob.getResourceKey(); |
| | | } |
| | | |
| | | long now = System.currentTimeMillis(); |
| | | long expiredMillis = expired.multiply(new BigDecimal("60000")).longValue(); |
| | | BigDecimal expiredValue = expired == null ? new BigDecimal("120") : expired; |
| | | long expiredMillis = expiredValue.multiply(new BigDecimal("60000")).longValue(); |
| | | if (expiredMillis <= 0L) { |
| | | expiredMillis = 2L * 60L * 60L * 1000L; |
| | | } |
| | |
| | | .signWith(key) // 重点:传入上面生成的 key 对象,而不是 String |
| | | .compact(); |
| | | cacheTokenUsage(token, expiredMillis); |
| | | String domain = StringUtils.trimTrailingCharacter(properties.getDomain(), '/'); |
| | | String prefix = properties.getUrlPrefix().startsWith("/") ? properties.getUrlPrefix() : "/" + properties.getUrlPrefix(); |
| | | String normalizedActionPath = StringUtils.hasText(actionPath) ? actionPath : "/preview/"; |
| | | if (!normalizedActionPath.startsWith("/")) { |
| | | normalizedActionPath = "/" + normalizedActionPath; |
| | | } |
| | | if (!normalizedActionPath.endsWith("/")) { |
| | | normalizedActionPath = normalizedActionPath + "/"; |
| | | } |
| | | return domain + prefix + normalizedActionPath + storageBlob.getUidFilename() + "?token=" + token; |
| | | return baseUrl + "?token=" + token; |
| | | } |
| | | |
| | | private void cacheTokenUsage(String token, long expiredMillis) { |