使用Grails存储图像但无法在生产中存储CATALINA_HOME外部

时间:2018-01-19 17:38:29

标签: grails grails-2.5

我正在使用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文件夹中时,一切正常。但这不是我想要做的情景。

1 个答案:

答案 0 :(得分: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)
}