Spring WebFlux:如何在 R2DBC 数据库 (PostgreSQL) 中存储文件?

问题描述

尝试了我能想到的所有方法,以便使用 WebFlux 和 R2DBC PostgresDriver 将文件存储在表中,但没有成功,而它与 SpringMVC 以非响应方式一起工作。

非反应性

控制器

    @PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") multipartfile file) {
      String message = "";
      try {
        storageService.store(file);
        message = "Uploaded the file successfully: " + file.getoriginalFilename();
        return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message));
      } catch (Exception e) {
        message = "Could not upload the file: " + file.getoriginalFilename() + "!";
        return ResponseEntity.status(HttpStatus.EXPECTATION_Failed).body(new ResponseMessage(message));
      }
    }

服务

    public FileDB store(multipartfile file) throws IOException {
      String fileName = StringUtils.cleanPath(file.getoriginalFilename());
      FileDB FileDB = new FileDB(fileName,file.getContentType(),file.getBytes());
      return fileDBRepository.save(FileDB);
    }

邮递员

Client

数据库

PostgreSQL

反应式

控制器

    @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Mono<Certificate> uploadFile(@RequestPart("file") Mono<FilePart> file) {
        return file.flatMap(this.service::store);
    }

服务

    public Mono<Certificate> store(FilePart file) {
        try {
            String fileName = StringUtils.cleanPath(file.filename());
            Certificate cert = new Certificate();
            // cert.setCertificate(file.getBytes());
            cert.setFileName(fileName);
            // cert.setFileType(file.getContentType());
            return repository.save(cert);
        } catch (Exception e) {
            return Mono.empty();
         }
    }

数据库

Reactive

问题

反应式代码允许我存储文件名,但我无法从 byte[] 中取出 FilePart

使用 MultiPart 而不是 FilePart 会抛出一个 application/PDF format not supported 我尝试使用 Flux 而不是 Mono,或者使用 @RequestBody,@RequestPart 没有成功。

有人能告诉我如何在不将文件保存到磁盘的情况下从 byte[]获取 FilePart 或任何其他方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)