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

Using Grails to store image but could not store outside CATALINA_HOME in production

我正在使用 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 目录与 tomcat 存储在单独的分区 /var 中),目录已创建,但文件从未存储过。

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

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

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

Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful. ...

@return true if and only if the renaming succeeded; false otherwise

因此我认为 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)
}