gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:34 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com