2012-01-13 26 views
10

Ứng dụng hoạt động tốt trong phát triển nhưng trong sản xuất tôi nhận được Errno :: EACCES Permission Denied lỗi khi tôi cố gắng tải lên một tập tin bằng cách sử dụng Carrierwave. Tôi chắc rằng nó có liên quan đến quyền. Làm cách nào để tôi có thể đặt quyền cho phép tải lên tệp?Rails 3. nhận Errno :: EACCES Permission Bị từ chối khi tải các tập tin lên sản xuất

pdf_uploader.rb

def store_dir 
    "#{Rails.root}/uploads/#{model.id}" 
end 

def cache_dir 
    "#{Rails.root}/tmp/uploads/cache/#{model.id}" 
end 
+1

là heroku này hoặc một dịch vụ khác? –

+0

là một ứng dụng sử dụng ActiveAdmin. Nó sử dụng CarrierWave để tải tệp lên. Tôi sử dụng Apache và Hành khách. – leonel

+1

Tôi đã nhận được 'Errno :: EACCESS' trên'/uploads' .. sửa lỗi của tôi là thêm '# {Rails.root}/public /' vào phương thức 'store_dir'. :) Hy vọng rằng sẽ giúp một ai đó! – RGB

Trả lời

15
chmod -R 777 PATH_TO_APP/uploads 
chmod -R 777 PATH_TO_APP/tmp 
+9

không phải là nguy hiểm sao? – leonel

+0

Không, việc tạo những thư mục như vậy có thể ghi được cho những người dùng khác là điều bình thường. – alexkv

+0

cách đảm bảo thư mục này có các quyền thích hợp cho các ứng dụng sản xuất đang được triển khai bằng capistrano? – Danny

2

Uhm Tôi đã được gặp cùng một vấn đề với một máy chủ ubuntu. Tải lên một tập tin với carrierwave và sau đó cố gắng để đọc nó với roo (một viên ngọc cho các tập tin excel).

Errno::EACCES in IngestionController#upload 
Permission denied 

Quyền đã chmod-ed để 777 vào thư mục đó và tập tin được tạo ra ok. Tôi tin rằng vấn đề là khi đọc đường dẫn cửa hàng.

excelx_file = params[:excel_file] 
filex = MetadataUploader.new 
filex.store!(excelx_file) 
workbook = Excelx.new("#{filex.store_path}") <- This is the actual line throwing the error. 

Mặc dù mọi thứ đều ổn khi thực hiện cùng một ứng dụng trên mac của tôi.

+0

Trong trường hợp của tôi nó là một vấn đề với roo được hones .. Tôi giải thích tất cả mọi thứ ở đây: http://stackoverflow.com/questions/11015448/errnoeacces-in-controllerupload-rails-roo-carrierwave-on-ubuntu/11023278# 11023278 – Hiromichan

2

Theo như tôi biết có hai điều có thể xảy ra ở đây:

1) Thư mục bạn đang tiết kiệm hình ảnh của bạn để không đã đọc đặc quyền/ghi cho những người dùng khác.

Để khắc phục:

terminal

$ cd [my_app] 
$ chmod -R 666 tmp 
$ chmod -R 666 public/uploads 

hoặc nếu bạn đang lưu hình ảnh của bạn trong một thư mục riêng:

$ chmod -R 666 private/uploads 

Chúng tôi đang sử dụng 666 trên 777. 666 cho phép đọc và ghi các đặc quyền vào một thư mục, và carrierwave cần ghi hình ảnh của nó. 777 cho phép đọc, ghi các đặc quyền và cho các tệp thi hành được thực hiện! Nói cách khác, một chương trình khó chịu có thể được tải lên máy chủ của bạn được ngụy trang làm hình ảnh nếu bạn đang sử dụng 777. Mặc dù danh sách trắng mở rộng của carrierwave giải quyết vấn đề này, bạn nên luôn sử dụng 666 trên 777.

2) Bạn không sử dụng các chuỗi được trích dẫn kép trong phương thức store_dir.

Để khắc phục:

app/example_uploader.rb

class BaseUploader < CarrierWave::Uploader::Base 
    # other methods removed for brevity 

    def store_dir 
    "#{Rails.root}/private/" # works perfectly. Many thanks to @RGB 
    end 

end 

Chỉ muốn chỉ ra cách tinh tế này là. Bạn cần chuỗi được trích dẫn kép và Rails.root! Tôi đã làm điều này:

def store_dir 
    Rails.root + '/private' # raises Errno::EACCES error 
end 

và hoàn toàn không hoạt động. Rất tinh tế. Cộng đồng nên giải quyết vấn đề này.

0

Chúng tôi cần phải cấp quyền truy cập vào thư mục cần thiết cho người sử dụng hệ thống rễ

sudo chmod 777 -R your_project_directory_to_be_access 

Vì lý do an ninh, chỉ cần ghi nhớ của bạn:

chmod 777 mang đến cho tất cả mọi người đọc, viết và thực thi quyền đó đối với hầu hết các vấn đề là dứt khoát quá nhiều.

Các vấn đề liên quan