1

我正在使用 roo 在 ubuntu 上的 rails 应用程序上解析一些 excelx 文件。这些是通过 Carrierwave 上传的。

这是我实际的控制器线:

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 = filename

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

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

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

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

Permission denied - oo_2895_1872934321

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

谢谢!

4

1 回答 1

1

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

我看过: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'] 将返回零。

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

现在:

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

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

向我致敬!

于 2012-06-13T21:05:03.740 回答