FileController
@GetMapping ( "/tea/downloadFormula" )
public ResponseEntity < byte [ ] > downloadFormula ( ) { logger. info ( "下载茶类配方, {}" , JSONObject . toJSONString ( req) ) ; List < String > macList = req. getMacList ( ) ; File tempFileDirectory = new File ( gemiFilePath) ; if ( ! tempFileDirectory. exists ( ) ) { tempFileDirectory. mkdirs ( ) ; } logger. info ( "临时文件目录路径: {}" , tempFileDirectory. getAbsolutePath ( ) ) ; String filePath, fileName, outputFileName = LocalDateTime . now ( ) . format ( DateTimeFormatter . ofPattern ( "yyyyMMdd" ) ) ; List < GemiTeaFormulaVO > formulaVOList; Map < Integer , List < GemiTeaFormulaVO > > formulaMap; Integer teaId; String teaCategory, imageUrl; List < GemiTeaFormulaVO > tempListByFormulaName; for ( String mac : macList) { filePath = mac; fileName = mac + ".json" ; logger. info ( "filePath:{} fileName:{}" , filePath, fileName) ; formulaVOList = gemiTeaFormulaDao. getTeaFormulaByMac ( mac) ; if ( formulaVOList == null || formulaVOList. size ( ) == 0 ) { logger. info ( "没有查到配方" ) ; continue ; } JSONArray jsonArray = new JSONArray ( ) ; JSONObject jsonObject; GemiTea gemiTea; int teaCategoryNum = 1 ; formulaMap = groupByFormulaName ( formulaVOList) ; for ( Map. Entry < Integer , List < GemiTeaFormulaVO > > entry : formulaMap. entrySet ( ) ) { teaId = entry. getKey ( ) ; gemiTea = gemiTeaDao. getById ( teaId) ; if ( gemiTea == null ) { continue ; } teaCategory = gemiTea. getTeaCategory ( ) ; imageUrl = gemiTea. getImageUrl ( ) ; logger. info ( "teaCategory:{} imageUrl:{}" , teaCategory, imageUrl) ; tempListByFormulaName = entry. getValue ( ) ; jsonObject = new JSONObject ( ) ; jsonObject. put ( "id" , teaId + "_" + teaCategoryNum) ; jsonObject. put ( "name" , gemiTea. getTeaCategory ( ) ) ; jsonObject. put ( "total" , tempListByFormulaName. size ( ) ) ; JSONArray formulaArray = new JSONArray ( ) ; JSONObject formulaObject; Integer formulaId; List < GemiTeaFormulaDetail > gemiTeaFormulaDetailList; for ( GemiTeaFormulaVO formulaVO: tempListByFormulaName) { formulaId = formulaVO. getId ( ) ; formulaObject = new JSONObject ( ) ; formulaObject. put ( "id" , formulaId) ; formulaObject. put ( "name" , formulaVO. getFormulaName ( ) ) ; gemiTeaFormulaDetailList = gemiTeaFormulaDetailDao. getByFormulaId ( formulaId) ; if ( gemiTeaFormulaDetailList == null || gemiTeaFormulaDetailList. size ( ) == 0 ) { gemiTeaFormulaDetailList = new ArrayList < > ( ) ; } JSONArray formulaDetailArray = new JSONArray ( ) ; JSONObject formulaDetailObject; for ( GemiTeaFormulaDetail formulaDetail: gemiTeaFormulaDetailList ) { formulaDetailObject = new JSONObject ( ) ; formulaDetailObject. put ( "id" , formulaDetail. getCurrentStage ( ) ) ; formulaDetailObject. put ( "waterOutput" , formulaDetail. getWaterOutput ( ) ) ; formulaDetailObject. put ( "waterOutletTemp" , formulaDetail. getWaterOutletTemp ( ) ) ; formulaDetailObject. put ( "mixMethod" , formulaDetail. getMixMethod ( ) ) ; formulaDetailObject. put ( "frothingTime" , formulaDetail. getFrothingTime ( ) ) ; formulaDetailObject. put ( "nextStage" , formulaDetail. getNextStage ( ) ) ; formulaDetailArray. add ( formulaDetailObject) ; } formulaObject. put ( "total" , formulaDetailArray. size ( ) ) ; formulaObject. put ( "subsection" , formulaDetailArray) ; formulaArray. add ( formulaObject) ; } jsonObject. put ( "formula" , formulaArray) ; jsonArray. add ( jsonObject) ; teaCategoryNum++ ; logger. info ( "mac:{} 开始生成图片文件" , mac) ; ImageTool . downloadImage ( imageUrl, filePath, mac + "_" + teaCategory + ".png" ) ; } logger. info ( "json:{}" , jsonArray. toJSONString ( ) ) ; logger. info ( "mac:{} 开始生成json文件" , mac) ; GemiFileUtil . createJsonFile ( filePath, fileName, jsonArray. toJSONString ( ) ) ; } ByteArrayOutputStream baos = new ByteArrayOutputStream ( ) ; ZipTool . createZipFile ( tempFileDirectory, baos) ; GemiFileUtil . deleteDirectory ( tempFileDirectory) ; HttpHeaders headers = new HttpHeaders ( ) ; headers. add ( "Content-Disposition" , "attachment; filename=" + outputFileName + ".zip" ) ; return ResponseEntity . ok ( ) . headers ( headers) . contentLength ( baos. size ( ) ) . body ( baos. toByteArray ( ) ) ;
}
FileUtil
private static final String fileTemp= "/fileTemp" ; public static File createJsonFile ( String filePath, String fileName, String jsonString) { File tempFileDirectory = new File ( fileTemp+ "/" + filePath) ; if ( ! tempFileDirectory. exists ( ) ) { tempFileDirectory. mkdirs ( ) ; } logger. info ( "生成文件路径:" + ( fileTemp+ "/" + filePath + "/" + fileName) ) ; File jsonFile = new File ( fileTemp+ "/" + filePath + "/" + fileName) ; try ( FileWriter fileWriter = new FileWriter ( jsonFile) ) { fileWriter. write ( jsonString) ; } catch ( IOException e) { e. printStackTrace ( ) ; } return jsonFile; } public static void deleteDirectory ( File directory) { if ( directory. exists ( ) ) { File [ ] files = directory. listFiles ( ) ; if ( files != null ) { for ( File file : files) { if ( file. isDirectory ( ) ) { deleteDirectory ( file) ; } else { file. delete ( ) ; } } } directory. delete ( ) ; } }
ImageTool
private static final String filePath = "/filePath" ; public static void downloadImage ( String imageUrl, String filePath, String fileName) { CloseableHttpClient httpClient = HttpClients . createDefault ( ) ; HttpGet httpGet; try { logger. info ( "imageUrl:{}" , imageUrl) ; if ( StringUtils . isEmpty ( imageUrl) ) { logger. info ( "图片地址为空" ) ; return ; } httpGet = new HttpGet ( imageUrl) ; CloseableHttpResponse response = httpClient. execute ( httpGet) ; File tempFileDirectory = new File ( filePath + "/" + filePath) ; if ( ! tempFileDirectory. exists ( ) ) { tempFileDirectory. mkdirs ( ) ; } logger. info ( "path:" + tempFileDirectory. getAbsolutePath ( ) ) ; logger. info ( "生成文件路径:" + ( filePath + "/" + filePath + "/" + fileName) ) ; FileOutputStream fos = new FileOutputStream ( filePath + "/" + filePath + "/" + fileName) ; HttpEntity entity = response. getEntity ( ) ; if ( entity != null ) { entity. writeTo ( fos) ; logger. info ( "Image downloaded successfully!" ) ; } } catch ( IOException e) { e. printStackTrace ( ) ; } finally { try { if ( httpClient != null ) { httpClient. close ( ) ; } } catch ( IOException e) { e. printStackTrace ( ) ; } } }
ZipTool
public static void zipFiles ( File directory, String baseName, ZipArchiveOutputStream zos) throws IOException { File [ ] files = directory. listFiles ( ) ; if ( files == null ) { return ; } for ( File file : files) { Path filePath = file. toPath ( ) ; String entryName = baseName. isEmpty ( ) ? filePath. getFileName ( ) . toString ( ) : baseName + "/" + filePath. getFileName ( ) . toString ( ) ; if ( Files . isDirectory ( filePath) ) { ZipArchiveEntry dirEntry = new ZipArchiveEntry ( entryName + "/" ) ; zos. putArchiveEntry ( dirEntry) ; zos. closeArchiveEntry ( ) ; zipFiles ( file, entryName, zos) ; continue ; } ZipArchiveEntry fileEntry = new ZipArchiveEntry ( entryName) ; zos. putArchiveEntry ( fileEntry) ; try ( InputStream fis = Files . newInputStream ( filePath) ) { byte [ ] buffer = new byte [ 1024 ] ; int length; while ( ( length = fis. read ( buffer) ) > 0 ) { zos. write ( buffer, 0 , length) ; } } zos. closeArchiveEntry ( ) ; } } public static void createZipFile ( File directory, ByteArrayOutputStream byteArrayOutputStream) { ZipArchiveOutputStream zos = null ; try { zos = new ZipArchiveOutputStream ( byteArrayOutputStream) ; zipFiles ( directory, "" , zos) ; } catch ( IOException e) { e. printStackTrace ( ) ; } finally { try { if ( zos != null ) { zos. close ( ) ; } } catch ( IOException e) { e. printStackTrace ( ) ; } } }