feat: (REQ-3540) 根据文件的fileKey预览文件

This commit is contained in:
xudawei 2025-04-07 15:37:12 +08:00
parent d7dc42a8f9
commit c079f6767a
3 changed files with 120 additions and 27 deletions

View File

@ -8,6 +8,8 @@ import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.oss.http.model.ApiSignUrlUploadRequest;
import cn.axzo.oss.http.model.ApiSignUrlUploadResponse;
import cn.axzo.oss.http.model.file.FetchFileInfoRequest;
import cn.axzo.oss.http.model.file.FetchFileInfoResponse;
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
import cn.azxo.framework.common.model.CommonResponse;
@ -82,4 +84,20 @@ public class DocOssGateway {
}
/**
* 获取文件基础信息
*/
public FetchFileInfoResponse fetchFileInfo(FetchFileInfoRequest request) {
try {
log.info("DocOssGateway-fetchFileInfo request:{}", JSON.toJSONString(request));
CommonResponse<FetchFileInfoResponse> response = serverFileServiceApi.fetchFileInfo(request);
log.info("DocOssGateway-fetchFileInfo result:{}", JSON.toJSONString(response));
return response.getData();
} catch (Exception e) {
log.warn("DocOssGateway-fetchFileInfo exception", e);
throw new WpsException(WpsErrorCodeEnum.UPLOAD_ERROR);
}
}
}

View File

@ -0,0 +1,80 @@
package cn.axzo.nanopart.doc.wps.support;
import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum;
import cn.axzo.nanopart.doc.api.wps.response.WpsFetchDownloadResponse;
import cn.axzo.nanopart.doc.api.wps.response.WpsFetchFileResponse;
import cn.axzo.nanopart.doc.integration.DocOssGateway;
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.oss.http.model.file.FetchFileInfoRequest;
import cn.axzo.oss.http.model.file.FetchFileInfoResponse;
import cn.hutool.core.collection.CollectionUtil;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
/**
* @author xudawei@axzo.cn
* @date 2025/3/21
* @description wps支持
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class OssSupport {
private final DocOssGateway docOssGateway;
public WpsFetchFileResponse fetchFileInfo(String fileKey) {
FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build());
if (Objects.isNull(response) || Objects.isNull(response.getId())) {
return null;
}
return WpsFetchFileResponse.builder()
.docCode(response.getFileUuid())
.name(response.getFileName())
.version(1)
.size(response.getStorageSize())
.createAt(response.getCreateAt())
.updateAt(response.getUpdateAt())
.creatorId(response.getCreateBy())
.modifierId(response.getUpdateBy())
.build();
}
public WpsFetchDownloadResponse fetchDownload(String fileKey) {
FetchFileInfoResponse response = docOssGateway.fetchFileInfo(FetchFileInfoRequest.builder().fileKey(fileKey).build());
if (Objects.isNull(response) || Objects.isNull(response.getId())) {
return null;
}
return WpsFetchDownloadResponse.builder()
.url(this.downloadUrl(response.getFileUuid()))
.digest("")
.digestType("")
.headers(null)
.build();
}
/**
* 获取文件下载地址
*/
public String downloadUrl(String fileKey) {
if (StringUtils.isEmpty(fileKey)) {
return StringUtils.EMPTY;
}
ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest();
request.setFileKeys(Lists.newArrayList(fileKey));
List<ApiSignUrlDownloadResponse> responseList = docOssGateway.signUrlFetchDownload(request);
WpsAssertUtil.isFalse(CollectionUtil.isEmpty(responseList) || StringUtils.isBlank(responseList.get(0).getSignUrl()), WpsErrorCodeEnum.UPLOAD_ERROR);
return responseList.get(0).getSignUrl();
}
}

View File

@ -1,14 +1,5 @@
package cn.axzo.nanopart.doc.wps.wpsbase;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import com.google.common.collect.Lists;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.nanopart.doc.api.enums.WpsErrorCodeEnum;
@ -27,14 +18,19 @@ import cn.axzo.nanopart.doc.file.index.IndexManager;
import cn.axzo.nanopart.doc.file.index.domain.NameUsedException;
import cn.axzo.nanopart.doc.integration.DocOssGateway;
import cn.axzo.nanopart.doc.integration.DocUserProfileGateway;
import cn.axzo.nanopart.doc.wps.support.OssSupport;
import cn.axzo.nanopart.doc.wps.support.WpsAssertUtil;
import cn.axzo.nanopart.doc.wps.support.WpsSupport;
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
import cn.hutool.core.collection.CollectionUtil;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* wps对接基础信息
@ -52,11 +48,19 @@ public class WpsBaseManager {
private final DocPermissionProps docPermissionProps;
private final WpsSupport wpsSupport;
private final OssSupport ossSupport;
/**
* 获取文件基础信息
* @param docCode 文件编码
*/
public WpsFetchFileResponse fetchFileBase(String docCode) {
WpsFetchFileResponse wpsFetchFileResponse = ossSupport.fetchFileInfo(docCode);
if (Objects.nonNull(wpsFetchFileResponse) && Objects.nonNull(wpsFetchFileResponse.getDocCode())) {
return wpsFetchFileResponse;
}
IndexNode node = wpsSupport.findAndCheckByCode(docCode);
return WpsFetchFileResponse.builder()
.docCode(docCode)
@ -75,30 +79,21 @@ public class WpsBaseManager {
* @param docCode 文件编码
*/
public WpsFetchDownloadResponse fetchDownload(String docCode) {
WpsFetchDownloadResponse wpsFetchDownloadResponse = ossSupport.fetchDownload(docCode);
if (Objects.nonNull(wpsFetchDownloadResponse) && StringUtils.isNotBlank(wpsFetchDownloadResponse.getUrl())) {
return wpsFetchDownloadResponse;
}
IndexNode node = wpsSupport.findAndCheckByCode(docCode);
return WpsFetchDownloadResponse.builder()
.url(this.downloadUrl(node.getAttributes().getFileAttributes().getOssFileKey()))
.url(ossSupport.downloadUrl(node.getAttributes().getFileAttributes().getOssFileKey()))
.digest("")
.digestType("")
.headers(null)
.build();
}
/**
* 获取文件下载地址
*/
private String downloadUrl(String fileKey) {
if (StringUtils.isEmpty(fileKey)) {
return StringUtils.EMPTY;
}
ApiSignUrlDownloadRequest request = new ApiSignUrlDownloadRequest();
request.setFileKeys(Lists.newArrayList(fileKey));
List<ApiSignUrlDownloadResponse> responseList = docOssGateway.signUrlFetchDownload(request);
WpsAssertUtil.isFalse(CollectionUtil.isEmpty(responseList) || StringUtils.isBlank(responseList.get(0).getSignUrl()), WpsErrorCodeEnum.UPLOAD_ERROR);
return responseList.get(0).getSignUrl();
}
/**
* 文档权限
@ -107,7 +102,7 @@ public class WpsBaseManager {
public WpsPermissionResponse permission(WpsPermissionRequest request) {
IndexNode indexNode = indexManager.findOrNull(request.getDocCode());
if (StringUtils.isNotBlank(indexNode.getOrCreateFileAttributes().getFileExtension())
if (Objects.nonNull(indexNode) && StringUtils.isNotBlank(indexNode.getOrCreateFileAttributes().getFileExtension())
&& indexNode.getOrCreateFileAttributes().getFileExtension().equalsIgnoreCase("pdf")) {
return WpsPermissionResponse.preview(request.getPersonId());
}