该应用程序在开发中工作正常,但在生产中,当我尝试使用Carrierwave上传文件时,我得到Errno :: EACCES Permission Denied错误。我确定它与权限有关。如何设置允许文件上传的权限?
pdf_uploader.rb
def store_dir
"#{Rails.root}/uploads/#{model.id}"
end
def cache_dir
"#{Rails.root}/tmp/uploads/cache/#{model.id}"
end
答案 0 :(得分:16)
chmod -R 777 PATH_TO_APP/uploads
chmod -R 777 PATH_TO_APP/tmp
答案 1 :(得分:3)
据我所知,这里有两件事情可以进行:
1)您保存图像的目录没有其他用户的读/写权限。
修复:
终端
$ cd [my_app]
$ chmod -R 666 tmp
$ chmod -R 666 public/uploads
或者如果您要将图像保存在私人目录中:
$ chmod -R 666 private/uploads
我们使用666而不是777. 666允许对目录的读写权限,而carrierwave需要写入其图像。 777允许执行读取,写入权限和可执行文件!换句话说,如果您使用的是777,可以将令人讨厌的程序上传到伪装成图像的服务器。即使carrierwave的扩展名为白色-list解决了这个问题,你应该总是使用666而不是777.
2)您没有在store_dir
方法中使用双引号字符串。
修复:
应用程序/ example_uploader.rb
class BaseUploader < CarrierWave::Uploader::Base
# other methods removed for brevity
def store_dir
"#{Rails.root}/private/" # works perfectly. Many thanks to @RGB
end
end
只想指出这是多么微妙。你需要双引号字符串和Rails.root
!我这样做:
def store_dir
Rails.root + '/private' # raises Errno::EACCES error
end
它根本没用。如此微妙。社区应该解决这个问题。
答案 2 :(得分:2)
嗯,我在使用ubuntu服务器时遇到了同样的问题。使用carrierwave上传文件,然后尝试使用roo(excel文件的gem)读取它。
Errno::EACCES in IngestionController#upload
Permission denied
该目录上的权限已经被修改为777,并且文件创建正常。我相信问题是在阅读商店路径时。
excelx_file = params[:excel_file]
filex = MetadataUploader.new
filex.store!(excelx_file)
workbook = Excelx.new("#{filex.store_path}") <- This is the actual line throwing the error.
虽然在Mac上执行相同的应用程序时一切正常。
答案 3 :(得分:-1)
我们需要授予访问系统root用户所需目录的权限
sudo chmod 777 -R your_project_directory_to_be_access
出于安全考虑,请记住:
chmod 777
赋予每个人阅读,写作和执行权利,这对于大多数问题来说确实太过分了。