我正在尝试保存来自前端的表单数据(包括一些文件):
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?
感谢您的帮助。
答案 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