1

ubuntuのレールアプリでrooを使用していくつかのexcelxファイルを解析しています。これらは Carrierwave でアップロードされます。

これが私の実際のコントローラーラインです:

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

public/uploads のパーミッションは次のとおりです。

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 の実際の行は次のとおりです。

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

これで、Mac の dev でも同じコードが完全に機能するようになりました。実行中のサーバーは、dev の ubuntu でも puma です。アクセス許可を確認しましたが、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を見て、Excelファイルを処理するときにrooが何をするかを調べました。これが私が見つけたものです:

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 を返します。

そこで、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 に答える