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

时间:2019-04-30 08:42:40

标签: mongodb spring-webflux

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

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?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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