Как я могу создать новый составной файл с одним вложенным двоичным файлом и одним dto (json) из составного файла с несколькими двоичными файлами

#java #kotlin #file-upload #multipartform-data #spring-webclient

Вопрос:

Я пытаюсь получить составной файл и преобразовать несколько двоичных файлов в один zip-файл и создать на его основе новый составной файл с исходным dto . Я использую WebClient с Котлином. Если у кого — нибудь есть идеи-это будет полезно для меня?

 @RestController @RequestMapping("/api") class EntityController(  private val storageServiceClient: StorageServiceClient ) {  @PostMapping("/docs", produces = [MediaType.APPLICATION_JSON_VALUE], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])  fun uploadFile(  @RequestPart("entity") entityDto: EntityDto,  @RequestPart("file") file: Arraylt;MultipartFilegt;  ): ResponseEntitylt;EntityResponse?gt; {  return ResponseEntity.ok(storageServiceClient.uploadFile(entityDto, file)!!)  } }  

StorageServiceClient.kt : …импорт Работа с WebClient и некоторые развлечения на молнии

 fun fromFile(multipartFile: Arraylt;MultipartFilegt;): MultiValueMaplt;String, HttpEntitylt;*gt;gt; {  val builder = MultipartBodyBuilder()  builder.part("file", multipartFile)  return builder.build() }    fun uploadFile(entityDto: EntityDto, file: Arraylt;MultipartFilegt;): EntityResponse? {   file.forEach {  println(it.size)  }   val webClient: WebClient = webClientBuilder.build() val responseEntity = webClient  .post()  .uri("$storageServiceUrl")  .body(BodyInserters.fromMultipartData(fromFile(file)))  .retrieve()  .bodyToMono(EntityResponse::class.java)  .block()   return responseEntity  }  fun createZipInMemory(files: Arraylt;MultipartFilegt;): ByteArrayOutputStream? {  var baos: ByteArrayOutputStream? = null   val files: Arraylt;Stringgt; = arrayOf(  "/Users/someuser/Documents/image.pdf",  "/Users/someuser/Documents/9999.txt"  )  ZipOutputStream(BufferedOutputStream(ByteArrayOutputStream())).use { out -gt;  for (file in files) {  FileInputStream(file).use { fi -gt;  BufferedInputStream(fi).use { origin -gt;  val entry = ZipEntry(file.substring(file.lastIndexOf("/")))  out.putNextEntry(entry)  if (baos != null) {  origin.copyTo(baos, 1024)  }  }  }  }  }  return baos  } }