0

我正在使用 Grails 2.5.6 将上传的图像存储到服务器上的文件夹中。

以下是我存储图像的代码

mpr.multiFileMap.file.each{fileData->
  CommonsMultipartFile file = fileData
  File convFile = new File(file.getOriginalFilename());
  file.transferTo(convFile);
  /** Processing File **/
  File uploadedFile = new File("${directory}${generatedFileName}.${extension}")
  convFile.renameTo(uploadedFile)
}

我在开发(MacOSX High Sierra)上运行没有问题但是当我在生产(Ubuntu 14.04 服务器)上部署时,我无法将文件保存在 CATALINA_HOME 目录之外。

我已经检查了目标目录的权限和所有权,但仍然创建了目录,但从未存储过文件。

例如,我尝试将文件存储在 /home/tomcat/ 目录中(/home 目录与存储它 /var 的 tomcat 位于单独的分区中),创建了该目录,但从未存储该文件。

当我将目标目录放在 CATALINA_HOME 文件夹中时,一切正常。但这不是我想要做的场景。

4

1 回答 1

0

你说你的目标目录在另一个分区上,所以这个分区上可能使用了另一个文件系统。

或者,如果您查看 renameTo 方法的 javadoc,它会说:

此方法的行为的许多方面本质上是平台相关的:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果具有目标抽象路径名的文件可能不会成功已经存在。应始终检查返回值以确保重命名操作成功。...

@return true当且仅当重命名成功时; false否则

因此,我认为 renameTo 方法无法移动文件,不知道为什么,但您可以像这样重写代码:

mpr.multiFileMap.file.each{fileData->
    CommonsMultipartFile file = fileData
    File uploadedFile = new File("${directory}${generatedFileName}.${extension}")
    // String originalFilename = file.getOriginalFilename()
    // you can store originalFilename in database for example

    if(!uploadedFile.getParentFile().exists()) {
        uploadedFile.getParentFile().mkdirs()
        // You can set permissions on the target directory if you desired, using PosixFilePermission
    }

    file.transferTo(uploadedFile)
}
于 2018-01-20T09:49:25.867 回答