package com.fdkankan.scene.service.impl; import cn.hutool.core.io.FileTypeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.UUID; import com.fdkankan.common.constant.ConstantFileName; import com.fdkankan.common.constant.ConstantFilePath; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.CreateObjUtil; import com.fdkankan.scene.service.IFileConvertService; import java.io.BufferedInputStream; import java.io.File; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** *

* TODO *

* * @author dengsixing * @since 2022/5/17 **/ @Slf4j @Service public class FileConvertServiceImpl implements IFileConvertService { @Override public void convertTxtToModeldata(MultipartFile file, HttpServletResponse response) throws Exception { //生成uuid String fileName = "vision.modeldata"; String uuid = UUID.randomUUID().toString(); String path = ConstantFilePath.FILE_CONVERT_PATH + uuid; // String path = "F:\\mnt\\4Dkankan\\fileConvert\\" + uuid; String srcPath = path + File.separator + file.getOriginalFilename(); String targetPath = path + File.separator + fileName; File srcFile = new File(srcPath); if(!srcFile.getParentFile().exists()){ srcFile.getParentFile().mkdirs(); } file.transferTo(new File(srcPath)); String type = FileTypeUtil.getType(srcFile); if(!"txt".equals(type)){ throw new BusinessException(ErrorCode.FAILURE_CODE_7007, "txt"); } CreateObjUtil.convertTxtToVisionmodeldata(srcPath, targetPath); if(!FileUtil.exist(targetPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } // 设置返回内容格式 response.setContentType("application/octet-stream"); // 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码 // 中文不要太多,最多支持17个中文,因为header有150个字节限制。 // 这一步一定要在读取文件之后进行,否则文件名会乱码,找不到文件 // fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1"); // 设置下载弹窗的文件名和格式(文件名要包括名字和文件格式) response.setHeader("Content-Disposition", "attachment;filename=" + fileName); try( BufferedInputStream inputStream = FileUtil.getInputStream(targetPath); ServletOutputStream outputStream = response.getOutputStream(); ){ IoUtil.copy(inputStream, outputStream); //关闭流 IoUtil.close(outputStream); IoUtil.close(inputStream); }catch (Exception e){ log.error("文件流输出失败,文件路径: " + targetPath, e); throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } } @Override public void convertTxtToDam(MultipartFile file, HttpServletResponse response) throws Exception { //生成uuid String fileName = ConstantFileName.modelUUID+"_50k.dam"; String uuid = UUID.randomUUID().toString(); String path = ConstantFilePath.FILE_CONVERT_PATH + uuid; // String path = "F:\\mnt\\4Dkankan\\fileConvert\\" + uuid; String srcPath = path + File.separator + file.getOriginalFilename(); String targetPath = path + File.separator + fileName; File srcFile = new File(srcPath); if(!srcFile.getParentFile().exists()){ srcFile.getParentFile().mkdirs(); } file.transferTo(new File(srcPath)); String type = FileTypeUtil.getType(srcFile); if(!"txt".equals(type)){ throw new BusinessException(ErrorCode.FAILURE_CODE_7007, "txt"); } CreateObjUtil.convertTxtToDam( srcPath, targetPath); if(!FileUtil.exist(targetPath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } // 设置返回内容格式 response.setContentType("application/octet-stream"); // 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码 // 中文不要太多,最多支持17个中文,因为header有150个字节限制。 // 这一步一定要在读取文件之后进行,否则文件名会乱码,找不到文件 // fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1"); // 设置下载弹窗的文件名和格式(文件名要包括名字和文件格式) response.setHeader("Content-Disposition", "attachment;filename=" + fileName); try( BufferedInputStream inputStream = FileUtil.getInputStream(targetPath); ServletOutputStream outputStream = response.getOutputStream(); ){ IoUtil.copy(inputStream, outputStream); //关闭流 IoUtil.close(outputStream); IoUtil.close(inputStream); }catch (Exception e){ log.error("文件流输出失败,文件路径: " + targetPath, e); throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } } @Override public void convertTxtToLzma(MultipartFile file, HttpServletResponse response) throws Exception { //生成uuid String damFileName = ConstantFileName.modelUUID+"_50k.dam"; String lzmaFileName = damFileName + ".lzma"; String uuid = UUID.randomUUID().toString(); String path = ConstantFilePath.FILE_CONVERT_PATH + uuid; // String path = "F:\\mnt\\4Dkankan\\fileConvert\\" + uuid; String srcPath = path + File.separator + file.getOriginalFilename(); String damFilePath = path + File.separator + damFileName; String lzmaFilePath = path + File.separator + lzmaFileName; File srcFile = new File(srcPath); if(!srcFile.getParentFile().exists()){ srcFile.getParentFile().mkdirs(); } file.transferTo(new File(srcPath)); String type = FileTypeUtil.getType(srcFile); if(!"txt".equals(type)){ throw new BusinessException(ErrorCode.FAILURE_CODE_7007, "txt"); } CreateObjUtil.convertTxtToDam( srcPath, damFilePath); if(!FileUtil.exist(damFilePath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } CreateObjUtil.convertDamToLzmaByAbsolutePath(damFilePath); if(!FileUtil.exist(lzmaFilePath)){ throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } // 设置返回内容格式 response.setContentType("application/octet-stream"); // 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码 // 中文不要太多,最多支持17个中文,因为header有150个字节限制。 // 这一步一定要在读取文件之后进行,否则文件名会乱码,找不到文件 // fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1"); // 设置下载弹窗的文件名和格式(文件名要包括名字和文件格式) response.setHeader("Content-Disposition", "attachment;filename=" + lzmaFileName); try( BufferedInputStream inputStream = FileUtil.getInputStream(lzmaFilePath); ServletOutputStream outputStream = response.getOutputStream(); ){ IoUtil.copy(inputStream, outputStream); //关闭流 IoUtil.close(outputStream); IoUtil.close(inputStream); }catch (Exception e){ log.error("文件流输出失败,文件路径: " + lzmaFilePath, e); throw new BusinessException(ErrorCode.FAILURE_CODE_8005); } } }