在生产环境中使用 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)
}
我正在使用 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)
}