如何将 Mono<FilePart> 保存到 MongoDB?

How to save Mono<FilePart> to MongoDB?

我正在尝试保存来自前端的表单数据(包括一些文件):

React:
handleSubmit = (e) => {
        e.preventDefault();
        e.stopPropagation();
        const { authors, title, genre, description, content, cover} = this.state;
        let formData = new FormData();
        formData.append('authors', authors);
        formData.append('title', title);
        formData.append('genre', genre);
        formData.append('description', description);
        formData.append('content', content, content.name);
        formData.append('cover', cover, cover.name);
        postBook(formData)
            ...
    };

...

export function postBook(formData) {
    return fetch('/api/books/', {
        method: 'post',
        body: formData
    });
}

在后端,我正在尝试使用 WebFlux 并将数据从 Web 表单保存到 MongoDB:

@RestController
@RequestMapping("api/books")
public class BookController {
   ...
@PostMapping(value = "/", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Mono<BookDto> addNewBook(
            @RequestPart("authors") Mono<FormFieldPart> aut,
            @RequestPart("title") Mono<FormFieldPart> tle,
            @RequestPart("genre") Mono<FormFieldPart> gnr,
            @RequestPart("description") Mono<FormFieldPart> descr,
            @RequestPart("content") Mono<FilePart> cont,
            @RequestPart("cover") Mono<FilePart> cov) {
        Mono<String> authors = aut.map(FormFieldPart::value);
        Mono<String> title = tle.map(FormFieldPart::value);
        Mono<String> genre = gnr.map(FormFieldPart::value);
        Mono<String> description = descr.map(FormFieldPart::value);
        Flux<DataBuffer> content = cont.flatMapMany(Part::content);
        Flux<DataBuffer> cover = cov.flatMapMany(Part::content);
        return bookService.addNewBook(authors, title, genre, description, content, cover)
                .map(mapper::mapBookToDto)
                .switchIfEmpty(Mono.error(new Exception()));
    }
}

@Service
public class BookServiceImpl implements BookService {
  private GridFsTemplate fsTemplate;

  @Override
    public Mono<Book> addNewBook(Mono<String> authors, 
                                 Mono<String> title, 
                                 Mono<String> genre, 
                                 Mono<String> description, 
                                 Flux<DataBuffer> content, 
                                 Flux<DataBuffer> cover) {
        ???
        return null;
    }
}

问题是以 Flux<DataBuffer> 格式保存文件到 MongoDB。我试图使用这样的东西:

content.flatMap(DataBuffer::asInputStream).flatMap(is -> fsTemplate.store(is))

不过好像不行。有没有办法将 Mono<FilePart> 到 MongoDB 作为一个文件保存?

非常感谢你的帮助。

ReactiveGridFsTemplate 可以帮助保存 Mono<FilePart> 到 MongoDB:

@PostMapping("")
    public Mono<ResponseEntity> upload(@RequestPart Mono<FilePart> fileParts) {
        return fileParts
            .flatMap(part -> this.gridFsTemplate.store(part.content(), part.filename()))
            .map((id) -> ok().body(Map.of("id", id.toHexString())));
}

找到了 here