我正在使用Spring Boot + webflux应用程序并尝试为文件上传实现Rest API端点。一切正常,但org.springframework.http.codec.multipart.FilePart#transferTo
方法在第一行第一个位置添加了一些不可见的字符
在下面的屏幕截图中,您可以发现original.toml
文件的第一行为蓝色,uploaded.toml
为灰色(Atom Editor无法将[config]
识别为有效的toml键条目)。
同样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)
方法中。如果我评论这一行并且只是将自定义字符串写入文件,那么一切都很好,不会出现任何新符号。
可能因为编码而发生?但我没有找到如何指定文件传输的字符集。
请帮我解决这个问题。