java 删除一个文件并返回管道webflux中的前一个flux

goqiplq2  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(96)

我有一个处理filePart的用例。为了进行处理,我使用filePart.transferTo将其保存在本地。然后我从它创建一个通量,然后我想删除创建的本地文件。同样,我有下面的代码,但它试图删除文件,同时迭代通量,它只需要一次。我不能使用then,因为通量不会返回。有人能告诉我做这件事的正确方法吗?

class ClassA {

    FileHandlerService fileHandlerService;

    Flux<ClassB> functionA(Mono<FilePart> filePartMono) {
        fileHandlerService.saveFile(filePartMono)
        .then(filePartMono)
        .flatMap(this::getItems)
        .flatMap(item ->
            filePartMono.flatMap(
                filePart -> fileHandlerService.deleteFile(filePart))
            .then(Mono.just(item)))
    }

    Flux<ClassB> getItems(FilePart filePart) {
        // method body
    }
}
class FileHandlerService {
    public Mono<Void> saveFile(Mono<FilePart> filePartMono) {
        return filePartMono
            .flatMap(filePart ->  filePart.transferTo(Path.of(filePart.filename())));
    }

     public Mono<Void> deleteFile(FilePart filePart) {
        return Mono.fromRunnable(() -> {
                    File file = new File(filePart.filename());
                    Files.deleteIfExists(file.toPath());
                }).then()
                .subscribeOn(Schedulers.boundedElastic());
    }
}
b1zrtrql

b1zrtrql1#

您可以在完成时删除临时文件:

Flux<ClassB> functionA(Mono<FilePart> filePartMono) {
        return filePartMono.flatMapMany(filePart -> fileHandlerService.saveFile(filePartMono)
                        .then(filePartMono)
                        .flatMapMany(this::getItems)
                        .doOnComplete(() ->
                                filePartMono.flatMap(it -> fileHandlerService.deleteFile(it))
                                        .subscribeOn(Schedulers.boundedElastic())
                                        .subscribe()
                        ));
    }

相关问题