【问题标题】:Creating a file in linux server Java在 Linux 服务器 Java 中创建文件
【发布时间】:2017-08-07 14:25:42
【问题描述】:

我从客户端上传了一个 csv 文件,我想在服务器端创建这个文件。

这是我的功能

    public void uploadFile(FileUploadEvent e) throws IOException{

    UploadedFile uploadedCsv=e.getFile();

    String filePath="//ipAdress:/home/cg/Temp/input/ressource.csv"; 

    byte[] bytes=null;

    if(uploadedCsv != null){
        bytes=uploadedCsv.getContents();
        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
        String filename = FilenameUtils.getName(uploadedCsv.getFileName());
        stream.write(bytes);
        stream.close();
    }
    }

当我想写文件时,我得到了这个异常(没有这样的文件或目录)

SEVERE: java.io.FileNotFoundException: /ipAdress:/home/cg/Temp/input/ressource.csv (No such file or directory)

知道在服务器上创建了/home/cg/Temp/输入路径。

【问题讨论】:

  • 哪些机器是Linux?客户端?服务器?两者都有?
  • @StephenC 服务器机器是 Linux 并且客户端可以通过 Web 浏览器与任何机器进行交互
  • 在那种情况下......你为什么要在 Linux 上使用 Windows UNC 路径名语法? Linux 不支持 UNC 路径。
  • @StephenC 我使用的文件在服务器上的路径都是。路径是ipAdress/home/cg/Temp/input/
  • 那么在您的示例中,该冒号在路径名中的作用是什么?并在错误消息中?

标签: java linux file


【解决方案1】:

你可以试试:

String filePath="////ipAdress/home/cg/Temp/input/ressource.csv";

代替:

String filePath="//ipAdress:/home/cg/Temp/input/ressource.csv";

还有这个:

new File(new URI(filePath))

代替:

new File(filePath)

或者你可以使用 jcif API How can I open a UNC path from Linux in Java?

【讨论】:

  • 先谢谢您的回复,可惜问题依旧存在。
  • String filePath="////ipAdress/home/cg/Temp/input/ressource.csv"; ?
  • 问题仍然出现,但使用 // 或 //// 在跟踪中我总是只有一个“/”
  • 您可以从终端打开文件,如果是这样,请尝试使用 File.exists() 来测试它是否存在,遵循 java doc docs.oracle.com/javase/6/docs/api/java/io/File.html#exists()
  • 当我尝试它时,我得到这个错误严重:java.lang.IllegalArgumentException:URI 不是绝对的
【解决方案2】:

我会在文件本身的上一层使用<file>.mkdirs();

String filePath="//ipAdress:/home/cg/Temp/input 也是如此 File directory = new File(filePath); directory.mkdirs();

然后您可以制作文件 File tempFile = new File(directory + "/ressource.csv);

或者一个更干净的解决方案就是使用Files.createTempFile(prefix, suffix) 这将在系统的临时目录中创建一个文件。

【讨论】:

  • 先谢谢您的回复,可惜问题依旧存在。
  • 你知道文件路径实际上存在于服务器上吗?你知道这个文件确实存在吗?
  • 是的,当然是我创建了它,并且我生成了 URL。
  • 那么当您将new File(filePath) 分离到一个新变量中并执行 Files.createFile 时会发生什么?
【解决方案3】:

您的代码不起作用的原因是您试图在 Linux 上使用 UNC 路径名。 Linux 本身不支持 UNC 路径名。他们是 Windows 主义。

这是你的例子

"//ipAdress:/home/cg/Temp/input/ressource.csv";

如果您尝试在 Linux 上使用它,操作系统将在文件系统的根目录中查找目录。它将查找的目录名称为ipaddress: ...注意目录名称中有一个冒号!

这很可能会失败...因为/ 目录中不存在具有该名称的目录。您收到的异常消息与此诊断一致

如果您这样做是因为您试图将文件推送到其他系统,那么您将采用其他方式。例如:

(无论您采用哪种方式,都需要考虑安全问题!)

尝试这个新文件(新 URI(文件路径))而不是新文件(文件路径)我得到这个错误。严重:java.lang.IllegalArgumentException:URI 不是绝对的

这行不通。 UNC 名称不是有效的 URL 或 URI。

【讨论】:

    【解决方案4】:

    我已经找到了解决这个问题的方法,但它并不聪明而且仍然有效

        String fileName="ressource.csv";
    
        File f = new File(System.getProperty("user.home") + "/Temp/input",fileName);
        if (f.exists() && !f.canWrite())
            throw new IOException("erreur " + f.getAbsolutePath());
        if (!f.exists())
            Files.createFile(f.toPath());
        if (!f.isFile()) {
            f.createNewFile(); // Exception here
        } else {
            f.setLastModified(System.currentTimeMillis());
        }
    

    等待更智能的解决方案

    【讨论】:

      猜你喜欢
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2016-09-26
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多