ubuntu - Controller 中的 Errno::EACCES#upload rails roo carrierwave on ubuntu

标签 ubuntu carrierwave

我在 ubuntu 上的 Rails 应用程序中使用 roo 解析一些 excelx 文件。这些是使用 Carrierwave 上传的。

这是我的实际 Controller 行:

excelx_file = params[:excel_file]
filex = MetadataUploader.new
filex.store!(excelx_file)
workbook = Excelx.new("#{filex.store_path}")

以下是公开/上传的权限:

drwxrwxr-x 2 pirames pirames 4096 Jun 13 14:03 metadata_ingestion
drwxrwxr-x 2 pirames pirames 4096 Jun 13 14:24 tmp

这里是文件的权限:

ls -l public/uploads/metadata_ingestion/
total 608
-rw-r--r-- 1 pirames pirames 621504 Jun 13 14:24 Bozza_Pirames_Distribuito.xlsx

这里是实际的轨迹:

Errno::EACCES in IngestionController#upload

Permission denied - oo_2895_1872934321
Rails.root: /var/www/mascarino

Application Trace | Framework Trace | Full Trace
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:247:in `mkdir'
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:247:in `fu_mkdir'
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:176:in `block in mkdir'
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:175:in `each'
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:175:in `mkdir'
roo (1.10.1) lib/roo/excelx.rb:95:in `initialize'
app/controllers/ingestion_controller.rb:24:in `new'
app/controllers/ingestion_controller.rb:24:in `upload'
actionpack (3.2.3) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (3.2.3) lib/abstract_controller/base.rb:167:in `process_action'
actionpack (3.2.3) lib/action_controller/metal/rendering.rb:10:in `process_action'

在抛出错误之前调用的 roo 上的实际行如下: @filename = 文件名

关于 https://github.com/hmcgowan/roo/blob/master/lib/roo/excelx.rb

现在,相同的代码在我的 mac 上的 dev 上可以完美运行。运行的服务器也是 ubuntu on dev 上的 puma。 我已经检查了权限,我的 mac 上也有同样的权限。我已检查拥有该文件夹的用户是否与运行服务器的用户相同。

有什么想法吗?我错过了什么吗?

编辑:我在跟踪中的错误消息中也注意到了:

Permission denied - oo_2895_1872934321

2895是运行的Puma服务器的PID。如果我传递上传文件的实际路径而不是 #{filex.store_path},结果不会改变。

谢谢!

最佳答案

是的!我的假设是正确的...

我看过:https://github.com/hmcgowan/roo/blob/master/lib/roo/excelx.rb找出 roo 在处理 excel 文件时的作用。所以这是我发现的:

def initialize(filename, packed=nil, file_warning = :error) #, create = false)
super()
@file_warning = file_warning
@tmpdir = "oo_"+$$.to_s
@tmpdir = File.join(ENV['ROO_TMP'], @tmpdir) if ENV['ROO_TMP'] 
unless File.exists?(@tmpdir)
  FileUtils::mkdir(@tmpdir)
end
filename = open_from_uri(filename) if filename[0,7] == "http://"
filename = unzip(filename) if packed and packed == :zip

@tmpdir 调用 ENV['ROO_TMP']。 ROO_TMP 在 roo 的 >1.1.0 版本中引入,这就是它以前工作的原因。

在我的例子中,ENV['ROO_TMP'] 将返回 nil。

所以我确实export ROO_TMP=/var/www/tmp来测试。然后chown -R 用户名/var/www/tmp。

现在:

1.9.3p194 :001 > ENV['ROO_TMP']
=> "/var/www/tmp"

这使一切正常,我能够处理我的文件:)

感谢我!

关于ubuntu - Controller 中的 Errno::EACCES#upload rails roo carrierwave on ubuntu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015448/

相关文章:

amazon-web-services - 我可以在没有 PEM 文件的情况下将文件复制到 Amazon EC2(使用 AWS CLI)吗?

c++ - Ubuntu 上的 boost::filesystem3::path::parent_path()

javascript - Carrierwave 图片上传不起作用

linux - 在命令行中安装 glassfish 3.1.2

linux - 在 Linux 服务器上构建 windows 7z SelF-eXtracting 安装程序,如何更改 exe 图标?

Docker 运行与拉取

ruby-on-rails - Carrierwave裁剪特定版本

ruby-on-rails - 如何通过载波将图像上传到 S3 并将文件名保存在数据库中?

ruby-on-rails - Carrierwave Cloudinary 图像上传有效,但上传后立即返回空值

ruby-on-rails - CarrierWave 与 Cloudfront 生成错误的 URL