从Mono <String>解开字符串

时间:2019-11-09 10:33:27

标签: java spring spring-boot reactive spring-reactive

我有一项服务,可以将图片上传到服务器。我在该服务上使用了Java Spring Reactive,我用dateformat重命名了文件,并且需要返回这个新名称。这就是我在服务中所做的事情:

@Override
public Mono<String> createImage(Flux<FilePart> files) {
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
    final String[] fileName = {""};

    return files.flatMap(file -> {
        Mono<Void> copyFile = Mono.just(Paths.get(UPLOAD_ROOT, dateFormat.format(date) + "." + FilenameUtils.getExtension(file.filename())).toFile())
                .log("createImage-picktarget").map(destFile -> {
                    try {
                        fileName[0] = dateFormat.format(date) + "." + FilenameUtils.getExtension(file.filename());
                        destFile.createNewFile();
                        return destFile;
                    } catch (IOException ioe) {
                        throw new RuntimeException(ioe);
                    }
                }).log("createImage-newFile").flatMap(file::transferTo).log("createImage-copy");

        return Mono.when(copyFile).log("createImage-when");
    }).log("createImage-flatMap").then(Mono.just(fileName[0])).log("createImage-done");
}

此代码将Mono返回到我的控制器。在此控制器中,我需要将Mono中的String返回给客户端,因为该字符串包含前端所需的新上传的文件名。这是我的控制器:

@PostMapping(value = "/upload")
public Mono<String> createFile(@RequestPart(name = "file")Flux<FilePart> files){
    Mono<String> saveImage = nasabahService.createImage(files);

    return saveImage.flatMap(value -> Mono.just(value));

}

我的问题是,如何从createImage函数返回的Mono中获取字符串,以便将其发送给客户端?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先,如果要构建反应式服务,则应返回Mono对象,并使用SSE(服务器发送的事件)通过spring来以非阻塞方式将字符串传递到前端。无论如何,我不明白为什么您要执行最后一个平面图,才能直接从控制器返回saveImage。

如果您真的需要返回字符串而不是mono对象,则必须使用Mono API中的.block()方法对其进行阻止并获取结果