Spring Webflux:FilePart transferTo在第一行

时间:2018-03-21 17:36:29

标签: java spring-webflux

我正在使用Spring Boot + webflux应用程序并尝试为文件上传实现Rest API端点。一切正常,但org.springframework.http.codec.multipart.FilePart#transferTo方法在第一行第一个位置添加了一些不可见的字符 在下面的屏幕截图中,您可以发现original.toml文件的第一行为蓝色,uploaded.toml为灰色(Atom Editor无法将[config]识别为有效的toml键条目)。

screen

同样diff给了我:

1c1
< [config]
---
> [config]

我的代码是:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.Part;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@Slf4j
public class UploadController {

  @PostMapping(value = "/upload",
      consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
      produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  public Flux<String> uploadFiles(@RequestBody Flux<Part> parts) {
    return
        parts
            .filter(p -> p instanceof FilePart)
            .cast(FilePart.class)
            .flatMap(this::saveFile)
            .map(File::getName)
            .doFinally(s -> log.debug("Upload files process completed with signal: {}", s));
  }

  private Mono<File> saveFile(FilePart filePart) {
    Path target = Paths.get("").resolve(filePart.filename());
    try {
      Files.deleteIfExists(target);
      File file = Files.createFile(target).toFile();

      return filePart.transferTo(file)
          .map(r -> file);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

}

问题出在filePart.transferTo(file)方法中。如果我评论这一行并且只是将自定义字符串写入文件,那么一切都很好,不会出现任何新符号。

可能因为编码而发生?但我没有找到如何指定文件传输的字符集。

请帮我解决这个问题。

0 个答案:

没有答案