Tomcat Web应用程序无法在网络上写入文件

时间:2013-10-29 11:30:41

标签: java tomcat networking

我在Windows上的Tomcat 7.0.42上有这个Web应用程序,它被指示在本地映射的网络目录上复制文件,例如N:\some\directory\file.txt,但是它无法这样做。

要定义输出文件,我使用的是URI语法file:///n:/some/directory/file.txt,但Files.copyFileUtils.copyFile都会引发IOException一些不太有用的错误消息:

URI desturi = new URI(srcpath);
File dest = new File(desturi);
Files.copy(source.toPath(), dest.toPath());
// error message: "c:\local\dir\file.txt -> n:\some\directory\file.txt"

FileUtils.copyFile(source, dest);
// error message: "Destination 'N:\some\directory' directory cannot be created"

其他一些信息:

  • 当然我可以在该目录上进行读写
  • 可执行文件.jar可以毫无问题地复制文件
  • 如果目的地位于本地驱动器中,一切正常
  • 我不认为安全管理器已加载,但我该如何检查?
  • Tomcat以我用于登录的用户身份启动(例如user.nameUSERNAME环境变量相同)

我没有想法......

更新堆栈跟踪的代码段。对于Files.copy

java.nio.file.NoSuchFileException: c:\local\dir\file.txt -> n:\some\directory\file.txt
    at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
    at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
    at sun.nio.fs.WindowsFileCopy.copy(Unknown Source)
    at sun.nio.fs.WindowsFileSystemProvider.copy(Unknown Source)
    at java.nio.file.Files.copy(Unknown Source)
    at it.augea.print.server.MyClass.copyFileToPath(MyClass.java:886)
    at it.augea.print.server.MyServlet.doPost(MyServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

FileUtils.copyFile

java.io.IOException: Destination 'N:\some\directory' directory cannot be created
    at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1015)
    at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:968)
    at it.augea.print.server.MyClass.copyFileToPath(MyClass.java:886)
    at it.augea.print.server.MyServlet.doPost(MyServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
顺便说一句,Apache Commons.io是v2.2。查看源代码,这些是涉及的行:

File parentFile = destFile.getParentFile();
if (parentFile != null)
    if (!parentFile.mkdirs() && !parentFile.isDirectory())
        throw new IOException("Destination '" + parentFile + "' directory cannot be created");

2 个答案:

答案 0 :(得分:1)

当Tomcat(或任何其他程序)作为Windows服务运行时,它在服务帐户下运行,并且这些帐户默认情况下不能访问映射的驱动器(或者如果内存正确地为我提供任何网络路径)。 Tomcat无法看到N:驱动器,因此任何写入它的尝试都将失败。

有几种可能的解决方案。我的建议是为Tomcat创建一个域帐户,该域帐户具有以下最低必要权限:a)在其运行的计算机上作为服务运行,b)在网络上写入所需的位置。最后,使用UNC路径// machinename / sharename / path / in / share而不是映射驱动器,你应该好好去。

答案 1 :(得分:0)

JVM无法为要复制的文件创建文件夹。

检查 JVM 是否可以访问它。