在FileSystem
中使用备用FilePart.transferTo
时,我发现在分段文件上传期间抛出了UnsupportedOperationException
。
在处理数据时,Spring会使用SynchronossFilePart
实现切换到另一个FileSystemProvider。有什么方法可以防止这种情况并迫使Spring仅使用所需的FileSystem?
下面提供了一个代码段,演示了使用google-cloud-nio作为文件系统的问题,该文件系统试图将上传的文件持久保存到google云存储中。
我正在使用Spring Boot 2.1.3
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Mono<Void> multipartUpload( final @RequestPart("file") FilePart filePart
) {
FileSystem fileSystem = CloudStorageFileSystem.forBucket("my-bucket");
// Code snippet that demonstrates connectivity to GCP is okay
//try {
// Files.write(fileSystem.getPath("successful-file"), "Just here to prove this works, this data is written to the bucket successfully, can be removed".getBytes());
//} catch (IOException e) {
// e.printStackTrace();
//}
return filePart.transferTo(fileSystem.getPath("failed-file"));
}
相关Stacktrace:
java.lang.UnsupportedOperationException: null
at java.base/java.nio.file.spi.FileSystemProvider.newFileChannel(FileSystemProvider.java:524)
at java.base/java.nio.channels.FileChannel.open(FileChannel.java:292)
at java.base/java.nio.channels.FileChannel.open(FileChannel.java:345)
at org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossFilePart.transferTo(SynchronossPartHttpMessageReader.java:334)
答案 0 :(得分:0)
CloudStorageFileSystemProvider
扩展了Java nio类FileSystemProvider
,该类是异常的起源。
CloudStorageFileSystemProvider
不会覆盖该类状态的默认行为的newFileChannel
方法和documentation方法:
需要默认提供程序来支持文件的创建 渠道。当不被覆盖时,默认实现抛出 UnsupportedOperationException。
这似乎是google-cloud-nio库的问题,尽管有可能可以改进webflux的实现,以便不依赖于其他提供程序缺少的实现。
更新: 似乎google-cloud-nio自{0.8} -alpha版本起已经released实现了newFileChannel方法,该方法应该可以解决此问题