文档类的转换参考https://www.cnblogs.com/Tom-shushu/p/17367203.html
一、引入jar包
阿里云没有Aspose的坐标,需要从Aspose仓库中把jar包下载到本地仓库引入
下载地址:Aspose Repository Browser /java/repo/
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d</artifactId>
<version>23.8.0</version>
</dependency>
注意:jar包类编译版本是9,jdk8运行会报错,需要使用高版本,我这里用的是jdk17
二、枚举
package cn.piesat.space.aspose.enums;
import com.aspose.threed.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
/**
* @author Marclew
* @date 2023/8/28 17:17
* @describe
*/
@Getter
@AllArgsConstructor
@SuppressWarnings("AlibabaEnumConstantsMustHaveComment")
public enum SolidSaveEnum {
Discreet_3DS_OUTPUT(1, FileFormat.DISCREET3DS, ".3ds"),
AMF_OUTPUT(2, FileFormat.AMF, ".amf"),
RVM_OUTPUT(3, FileFormat.RVM_BINARY, ".rvm"),
DAE_OUTPUT(4, FileFormat.COLLADA, ".dae"),
DRC_OUTPUT(5, FileFormat.DRACO, ".drc"),
FBX_OUTPUT(6, FileFormat.FBX7500ASCII, ".fbx"),
GLB_OUTPUT(7, FileFormat.GLTF2_BINARY, ".glb"),
OBJ_OUTPUT(8, FileFormat.WAVEFRONTOBJ, ".obj"),
PLY_OUTPUT(9, FileFormat.PLY, ".ply"),
STL_OUTPUT(10, FileFormat.STL_BINARY, ".stl"),
U3D_OUTPUT(11, FileFormat.UNIVERSAL3D, ".u3d"),
USD_OUTPUT(12, FileFormat.USD, ".usd"),
USDZ_OUTPUT(13, FileFormat.USDZ, ".usdz"),
GLTF_OUTPUT(14, FileFormat.GLTF2_BINARY, ".gltf"),
PDF_OUTPUT(15, FileFormat.PDF, ".pdf"),
HTML_OUTPUT(16, FileFormat.HTML5, ".html"),
;
private final int type;
private final FileFormat fileFormat;
private final String suffix;
public static SolidSaveEnum getTypeName(Integer type){
for(SolidSaveEnum asposeSaveOptionsEnum : values()){
if (asposeSaveOptionsEnum.getType() == type) {
//获取指定的枚举
return asposeSaveOptionsEnum;
}
}
return null;
}
}
三、controller
/**
* @description: 3D文件转换
*/
@ApiOperation(value = "3D文件转换")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "file", value = "输入文件支持后缀: (3ds、amf、rvm、dae、drc、fbx、glb、obj、ply、stl、u3d、usd、usdz、gltf)", dataType = "__file", required = true),
@ApiImplicitParam(name = "type", value = "输出文件类型: (1:3ds 2:amf 3:rvm 4:dae 5:drc 6:fbx 7:glb 8:obj 9:ply 10:stl 11:u3d 12:usd 13:usdz 14:gltf)", dataType = "int", required = true)
})
@PostMapping("/solidConvert")
@SneakyThrows(Exception.class)
public String solidConvert(@RequestParam("file") MultipartFile file, Integer type) {
return solidService.solidConvert(file, type);
}
四、转换方法
@Override
public String solidConvert(MultipartFile file, Integer type) {
// 1.跳过aspose的验证签名
TrialException.setSuppressTrialException(true);
// 2.输入文件格式是否符合要求
String suffix = FilenameUtils.getExtension(file.getOriginalFilename());
if (ObjectUtil.isEmpty(suffix)){
throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
}
suffix = suffix.toLowerCase();
if (!"3ds".equals(suffix) && !"amf".equals(suffix) && !"rvm".equals(suffix)
&& !"dae".equals(suffix) && !"drc".equals(suffix) && !"fbx".equals(suffix)
&& !"glb".equals(suffix) && !"obj".equals(suffix) && !"ply".equals(suffix)
&& !"stl".equals(suffix) && !"u3d".equals(suffix) && !"usd".equals(suffix)
&& !"usdz".equals(suffix) && !"gltf".equals(suffix)) {
throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
}
// 3.输出文件格式是否符合要求
SolidSaveEnum solidSaveEnum = SolidSaveEnum.getTypeName(type);
if (ObjectUtil.isEmpty(solidSaveEnum)){
throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
}
// 4.文件缓存到本地
String fileName = UUID.randomUUID() + "." + suffix;
String localOldFilePath = AsposeConstant.LOCAL_TEMP_ASPOSE_FILE_DIR + fileName;
File localOldFile = null;
try {
localOldFile = new File(localOldFilePath);
file.transferTo(localOldFile);
} catch (Exception e) {
e.printStackTrace();
}
// 5.开始转换
Scene scene = null;
try {
scene = Scene.fromFile(localOldFilePath);
} catch (IOException e) {
throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
}
String newFileName = UUID.randomUUID() + solidSaveEnum.getSuffix();
String newFilePath = AsposeConstant.LOCAL_TEMP_ASPOSE_FILE_DIR + newFileName;
try {
scene.save(newFilePath, solidSaveEnum.getFileFormat());
} catch (IOException e) {
throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
}
// 6.上传obs
File outputfile = new File(newFilePath);
String url = "";
try {
url = obsUtil.putObject(AsposeConstant.ASPOSE_SOLID_DIR + newFileName, outputfile);
} catch (Exception e) {
throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
}
localOldFile.delete();
outputfile.delete();
return url;
}
五、docker部署
制作一个jdk17镜像包作为基础镜像
下载一个jdk-17_linux-x64_bin.tar.gz上传到服务器
FROM centos:7
WORKDIR /usr/local/jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk/jdk-17.0.9
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/timezone
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.UTF8
ENV LANGUAGE=zh_CN.utf8
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
RUN yum -y install fontconfig \
&& yum -y install mkfontscale \
&& mkfontscale && mkfontdir \
&& fc-cache -fv
#容器启动时需要执行的命令
#CMD ["java","-version"]