Rails 3.获取Errno :: EACCES权限在生产时上传文件时被拒绝

该应用程序在开发中工作正常,但在生产中,当我尝试使用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 

 chmod -R 777 PATH_TO_APP/uploads chmod -R 777 PATH_TO_APP/tmp 

据我所知,这里有两件事情可以发生:

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的扩展名white-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 

它完全不起作用。 如此微妙。 社区应该解决这个问题。

嗯我和ubuntu服务器一直有同样的问题。 使用carrierwave上传文件,然后尝试使用roo(excel文件的gem)读取它。

 Errno::EACCES in IngestionController#upload Permission denied 

权限已在该目录上chmod至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上执行相同的应用程序时一切正常。

我们需要授予访问系统root用户所需目录的权限

 sudo chmod 777 -R your_project_directory_to_be_access 

出于安全考虑,请记住:

chmod 777为每个人提供了读,写和执行权限,这对于大多数问题来说确实太过分了。