问题描述
我正在开发 Spring Boot 应用程序,我需要将文件复制到远程机器。
当我在 Windows 机器上运行该程序时,它运行良好。代码如下:
void copyImage(multipartfile image,String name) {
name = name + "." + FileUtils.getExtension(image);
Path path = Paths.get("\\<remote-machine>\path\to\repository\" + name);
try {
Files.copy(image.getInputStream(),path,StandardcopyOption.REPLACE_EXISTING);
} catch (IOException e) {
// Handle exception here
}
}
正如预期的那样,当我在 Linux (Pop!_OS) 上运行该程序时,它不起作用。我相信传递给 Paths.get()
的参数格式不正确,因为 Windows 和 Linux 对待路径的方式不同。知道如何在 Linux 上使用这种方法吗?
解决方法
Linux 本身不支持 UNC paths - 它不明白这样的路径是指网络共享。您有多种选择:
- 使用通过 SMB 协议实现网络共享访问的 Java 库。一些积极支持的库是 JCIFS 和 SMBJ。这应该使您的应用程序可移植(您可以在 Linux 和 Windows 上运行它),但您依赖于一个额外的库,并且必须使用其自定义 API 来访问远程文件
- 在 Linux 上将远程共享挂载为 CIFS 卷 (official Ubuntu guide)。然后远程共享就可以访问了,就好像它是 Linux 上的本地目录一样。在这种情况下,您可以继续使用
java.nio
访问/复制文件,但需要确保将共享的根路径设为可配置(例如,Windows 上的\\host\share
和 Linux 上的/mnt/share
).