简体   繁体   中英

Paperclip gives Permission denied error with samba mount

In my development environment the codebase is mounted on a ubuntu-server VM using a samba mount, it is mounted as root and I run mongrel as root.

When I try and upload a file with Paperclip the file saves fine but then it seems to have problems creating the different styles.

I get the following error:

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'

It works fine however if I remove /foo/ from the folder structure of the mounted code and instead make it a symbolic link to somewhere directly within the Ubuntu VM.

In fileutils.rb, in the copy_metadata method, the rescue block should be changed from:

rescue Errno::EPERM

to:

rescue Errno::EPERM, Errno::EACCES

or maybe even more thorough:

rescue

so that it catches any errno code.

Because the error seems to be happening at the chown call, I'm guessing that the user that the file is being chown'd to/from doesn't have write permissions on the mount. It could be that the user on the VM isn't known on the other system, so when the chown happens it bails.

Check the user that the file is written as (chown'd to) when you remove /foo/ from the path, then see if you can write a file to the /foo/some/file/path/ directory as that user.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM