Problem with file upload

I have a simple app that allows users to upload image files to the web
server. It works fine on my laptop with Webrick, when I deploy to the
web server it also works fine with webrick. However, when I try to
connect via Apache, the files get uploaded to the /tmp directory, but
the never make it to the correct directory within the application (/
public/images/photos). I am sure that this is some permissions
problem with the Apache user (Apache runs as user:nobody,
group:nobody) but it appears that all of the correct permissions are
in place. Here are the permissions on the photos directory:

drwxrwxr-x 2 jzw nobody 4096 Jun 13 15:18 photos/

And here is the error:

Errno::EACCES (Permission denied - public/images/photos/28-full.jpg):
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in
`initialize'
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in `open'
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in
`save_full'
    /home/jzw/public_html/my_app/app/models/photo.rb:250:in
`save_file'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
`send'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
`callback'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
`each'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
`callback'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:243:in
`create_or_update'
    /vendor/rails/activerecord/lib/active_record/base.rb:1548:in
`save_without_validation'
    /vendor/rails/activerecord/lib/active_record/validations.rb:752:in
`save_without_transactions'
    /vendor/rails/activerecord/lib/active_record/transactions.rb:
129:in `save'
    /vendor/rails/activerecord/lib/active_record/connection_adapters/
abstract/database_statements.rb:59:in `transaction'
    /home/jzw/public_html/my_app/public/dispatch.fcgi:34

Errno::EACCES (Permission denied - public/images/photos/28-full.jpg):
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in
`initialize'
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in `open'
    /home/jzw/public_html/my_app/app/models/photo.rb:261:in
`save_full'
    /home/jzw/public_html/my_app/app/models/photo.rb:250:in
`save_file'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
`send'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:333:in
`callback'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
`each'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:330:in
`callback'
    /vendor/rails/activerecord/lib/active_record/callbacks.rb:243:in
`create_or_update'
    /vendor/rails/activerecord/lib/active_record/base.rb:1548:in
`save_without_validation'
    /vendor/rails/activerecord/lib/active_record/validations.rb:752:in
`save_without_transactions'
    /vendor/rails/activerecord/lib/active_record/transactions.rb:
129:in `save'
    /vendor/rails/activerecord/lib/active_record/connection_adapters/
abstract/database_statements.rb:59:in `transaction'
    /vendor/rails/activerecord/lib/active_record/transactions.rb:95:in
`transaction'
    /vendor/rails/activerecord/lib/active_record/transactions.rb:
121:in `transaction'
    /vendor/rails/activerecord/lib/active_record/transactions.rb:
129:in `save'
    /home/jzw/public_html/my_app/app/controllers/admin/
photos_controller.rb:79:in `new_or_edit'
    /home/jzw/public_html/my_app/app/controllers/admin/
photos_controller.rb:22:in `new'
    /vendor/rails/actionpack/lib/action_controller/base.rb:1097:in
`send'
    /vendor/rails/actionpack/lib/action_controller/base.rb:1097:in
`perform_action_without_filters'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:723:in
`call_filters'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:713:in
`call_filters'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:661:in
`call'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:661:in
`proxy_before_and_after_filter'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:482:in
`call'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:482:in
`call'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:711:in
`call_filters'
    /vendor/rails/actionpack/lib/action_controller/filters.rb:680:in
`perform_action_without_benchmark'
    /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:
66:in `perform_action_without_rescue'
    /usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
    /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:
66:in `perform_action_without_rescue'
    /vendor/rails/actionpack/lib/action_controller/rescue.rb:83:in
`perform_action'

Any help is greatly appreciated.

It has been a couple of weeks and I still have not figured this
out.... Surely someone out there has an idea....

I'm puzzled why Apache's should be the relevant user as it doesn't execute Rails code. But to test further if it is indeed a permissions issue, try either setting permissions to 777 (or 766) on that directory, or making nobody the owner (not just the group). Personally, I wouldn't try to give permissions to nobody as the whole point of that account is that it has none (which is an issue that crops up for Web DAV fairly frequently, see for example <http://www.lyra.org/pipermail/dav-dev/2001-August/002676.html>). But creating world writeable directories also has issues. So perhaps run apache as www group www and manage it as a real user -- if that is indeed the problem.