Paperclip使用samba mount提供Permission denied错误

时间:2009-10-14 21:07:33

标签: ruby-on-rails paperclip samba permission-denied

在我的开发环境中,代码库使用samba挂载安装在ubuntu-server VM上,它以root身份挂载,我以root身份运行mongrel。

当我尝试使用Paperclip上传文件时,文件保存得很好但是它似乎在创建不同样式时遇到了问题。

我收到以下错误:

Errno::EACCES (Permission denied - /foo/some/file/path/file-name-style.jpg):
  /usr/lib/ruby/1.8/fileutils.rb:1272:in `chown'
  /usr/lib/ruby/1.8/fileutils.rb:1272:in `copy_metadata'
  /usr/lib/ruby/1.8/fileutils.rb:452:in `copy_entry'
  /usr/lib/ruby/1.8/fileutils.rb:1324:in `traverse'
  /usr/lib/ruby/1.8/fileutils.rb:448:in `copy_entry'
  /usr/lib/ruby/1.8/fileutils.rb:507:in `mv'
  /usr/lib/ruby/1.8/fileutils.rb:1395:in `fu_each_src_dest'
  /usr/lib/ruby/1.8/fileutils.rb:1411:in `fu_each_src_dest0'
  /usr/lib/ruby/1.8/fileutils.rb:1393:in `fu_each_src_dest'
  /usr/lib/ruby/1.8/fileutils.rb:494:in `mv'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip/storage.rb:43:in `flush_writes'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip/storage.rb:39:in `each'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip/storage.rb:39:in `flush_writes'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip/attachment.rb:142:in `save'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:331:in `send'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:331:in `save_attached_files'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:324:in `each_attachment'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:323:in `each'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:323:in `each_attachment'
  vendor/gems/thoughtbot-paperclip-2.3.0/lib/paperclip.rb:330:in `save_attached_files'

但是,如果我从挂载的代码的文件夹结构中删除/ foo /,而是将其作为直接在Ubuntu VM中的某个位置的符号链接,它可以正常工作。

2 个答案:

答案 0 :(得分:0)

因为错误似乎是在chown调用时发生的,所以我猜测该文件被chown'd到/的用户没有对mount的写权限。可能是VM上的用户在另一个系统上是未知的,所以当chown发生时它就会失败。

当你从路径中删除/ foo /时,检查用户是否将文件写为(chown'd),然后查看是否可以将文件写入/ foo / some / file / path /目录用户。

答案 1 :(得分:0)

在fileutils.rb中,在copy_metadata方法中,应该从以下位置更改救援块:

rescue Errno::EPERM

为:

rescue Errno::EPERM, Errno::EACCES

或者甚至更彻底:

rescue

以便它捕获任何错误代码。