gpt4 book ai didi

Carrierwave 上传遇到 Errno::EEXIST - 文件存在错误

转载 作者:行者123 更新时间:2023-12-02 01:09:01 24 4
gpt4 key购买 nike

已在两台计算机上安装了 Rails3.2.18 应用程序:Ubuntu 14.04 和 osx 10.6 用于测试目的。

提交要在 OS X 机器上上传的文件(这些文件故意很大),并使用 Carrierwave 返回 Errno::EEXIST in [...]controller 指定:

File exists - /Users/user/app/releases/20141018152115/public/uploads

安装 Ubuntu 时不会出现此错误。 public/uploads 存在是因为它需要是 shared/public/uploads 的符号链接(symbolic link)以满足持久性要求。 capistrano3 部署命令

set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/uploads}

设置符号链接(symbolic link)。为了更好地衡量,我按顺序在两台计算机上运行部署以隔离任何应用程序问题。

所以这似乎又是一个 OSX 问题。一种假设是,尽管适当指定了(唯一)具有管理员权限的用户,但给定的阶段文件在 OSX 上配置错误:

set :deploy_to, '/Users/osxuser/app'
set :use_sudo, false
set :deploy_user, 'osxuser'

另一个假设与从 Capistrano2 到 Capistrano3 的迁移有关,因为此 osX 服务器在升级之前没有此类问题。

如何消除“文件存在”错误?

更新

/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:244:in `mkdir'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:244:in `fu_mkdir'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:221:in `block (2 levels) in mkdir_p'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:219:in `reverse_each'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:219:in `block in mkdir_p'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:205:in `each'
/Users/osxuser/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:205:in `mkdir_p'
carrierwave (0.9.0) lib/carrierwave/sanitized_file.rb:290:in `mkdir!'
carrierwave (0.9.0) lib/carrierwave/sanitized_file.rb:209:in `copy_to'
carrierwave (0.9.0) lib/carrierwave/uploader/cache.rb:131:in `block in cache!'
carrierwave (0.9.0) lib/carrierwave/uploader/callbacks.rb:17:in `with_callbacks'
carrierwave (0.9.0) lib/carrierwave/uploader/cache.rb:122:in `cache!'
carrierwave (0.9.0) lib/carrierwave/mount.rb:327:in `cache'
carrierwave (0.9.0) lib/carrierwave/mount.rb:179:in `production_file='
carrierwave (0.9.0) lib/carrierwave/orm/activerecord.rb:38:in `production_file='
activerecord (3.2.18) lib/active_record/attribute_assignment.rb:85:in `block in assign_attributes'
activerecord (3.2.18) lib/active_record/attribute_assignment.rb:78:in `each'
activerecord (3.2.18) lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
activerecord (3.2.18) lib/active_record/persistence.rb:216:in `block in update_attributes'
activerecord (3.2.18) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
activerecord (3.2.18) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
activerecord (3.2.18) lib/active_record/transactions.rb:208:in `transaction'
activerecord (3.2.18) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
activerecord (3.2.18) lib/active_record/persistence.rb:215:in `update_attributes'
app/controllers/bozzadocuments_controller.rb:62:in `block in update'

堆栈跟踪似乎想要 mkdir carrierwave (0.9.0) lib/rierwave/sanitized_file.rb:290:in mkdir!

载波 uploader 指定如下

  def store_dir
"uploads/#{model.class.to_s.underscore}/#{model.quote.cart_id}_#{model.quote.cart.created_at}_/#{model.quote_id}/#{model.id}"
end

最佳答案

这是创建 OS-X“别名”而不是符号链接(symbolic link)时的一个陷阱。

(不在实际的 Gems 或任何特定版本中 - 今天我在 Rails 5.0.0.1、Ruby 3.2.1 和 Carrierwave 0.11.2 中也经历了同样的情况。)

事实证明,我使用 OS X Finder 意外创建的不是一个符号链接(symbolic link),而是一个别名(从技术上讲,它不是符号链接(symbolic link)) )。当 Carrierwave 然后尝试创建文件夹结构时,FileUtils.mkir_p 会在尝试(重新)创建(现有)别名作为目录时引发错误。

rm ./app/releases/20141018152115/public/uploads
ln -s ./app/shared/public/uploads ./app/releases/$timestamp/public/uploads

应该可以解决问题。

[编辑:澄清实际根本原因不在 ruby​​、rails 或正在使用的 gems 中]

关于Carrierwave 上传遇到 Errno::EEXIST - 文件存在错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26462016/

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