#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 } }