【问题标题】:Copy a file to a Windows remote machine from Linux using java.nio.file.Files.copy()使用 java.nio.file.Files.copy() 将文件从 Linux 复制到 Windows 远程计算机
【发布时间】:2021-06-22 14:40:56
【问题描述】:

我正在开发一个 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 上运行吗?

【问题讨论】:

  • \` is the windows path separator. Try /` 作为起点。另请注意,remote machine\path 可能是一个非常具体的 windows 事物。含义:默认情况下,您无权访问远程系统的文件系统。您似乎正在使用某种机制来使远程文件系统在本地可用。所以,这真的不仅仅是“如何写下路径”。为了“只是一条路径”的工作,您需要可以使用远程 FS。
  • Linux 从不使用 \ 作为文件分隔符,也不使用 UNC 路径。您可能得到的最接近的结果是安装 CIFS 卷,例如support.zadarastorage.com/hc/en-us/articles/…

标签: java nio network-share


【解决方案1】:

Linux 本身不支持UNC paths - 它不理解这样的路径是指网络共享。您有多种选择:

  • 使用使用 SMB 协议实现网络共享访问的 Java 库。一些积极支持的库是JCIFSSMBJ。这应该使您的应用程序可移植(您可以在 Linux 和 Windows 上运行它),但您依赖于一个额外的库,并且必须使用其自定义 API 来访问远程文件
  • 在 Linux 上将远程共享挂载为 CIFS 卷 (official Ubuntu guide)。然后远程共享变得可访问,就好像它是 Linux 上的本地目录一样。在这种情况下,您可以继续使用 java.nio 访问/复制文件,但需要确保您的共享的根路径可配置(例如,Windows 上的 \\host\share 和 Linux 上的 /mnt/share)。

【讨论】:

  • 谢谢。第二个选项更适合我的情况。
猜你喜欢
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多