2011-12-05 15 views
6

Mã này tôi đang sử dụng:Không thể đọc tập tin với chức năng send_file trong Rails 3

Theo quan điểm của file:

<%= link_to "Download", download_image_path(image) %> 

Trong điều khiển:

def download 
    @image = Image.find(params[:id]) 
    send_file "#{RAILS_ROOT}/public" + @image.attachment.url 
end 

Tôi nhận được một lỗi:

Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022 

PS: kiểm tra gấp đôi, tệp tồn tại. Cùng một vấn đề trên máy chủ, cho tất cả các tập tin (hình ảnh, pdf, video) trong tất cả các bộ điều khiển tương ứng.

Trả lời

15

Issue là:

Tôi đã sử dụng

@image = Image.find(params[:id]) 
send_file "#{RAILS_ROOT}/public" + @image.attachment.url 

Nó phải là

@image = Image.find(params[:id]) 
send_file @image.attachment.path 

PS: Hãy chắc chắn rằng bạn xác nhận rằng hình ảnh/kỷ lục tồn tại.

+0

nếu bạn phân tích mã bằng brakeman, khi đó nó sẽ hiển thị lỗi dưới dạng thuộc tính MOdel được sử dụng làm tên tệp. chỉ cần chạy brakeman. xem xét là send_file Image.find (params [: id]). Uploaded_file.path – errakeshpd

0

Điều này có ?1320582022 thuộc về tên tệp không? Tôi cũng không chắc chắn về khoảng trắng trong tên tệp, có lẽ chúng cần phải được thoát.

+0

Screen Shot 2011/11/04 tại 3.14.03 PM.png là tên tập tin và 1320582022 đang đến nguyên nhân im nhận vấn đề trong chế độ phát triển .. –

1

Tôi không biết làm thế nào giúp bạn tiết kiệm url tập tin đính kèm hình ảnh, nhưng nói chung, một tên tập tin nên thích:

/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png 

Thông báo nó không có cuối cùng "xxxxx?".

Bạn có thể kiểm tra hệ thống tệp của mình, cho dù tên tệp là "Screen Shot 2011-11-04 lúc 3.14.03 PM.png" hoặc "Screen Shot 2011-11-04 tại 3.14.03 PM.png? 1320582022 ".

Đối với url của tệp, có thể là: http://example.com/xxx?dddd, ký tự nào "?" chia đường dẫn và tham số. Chuỗi "dddd" là thông số khi yêu cầu đường dẫn url, nó không phải là một phần của đường dẫn hoặc tên tệp. Tham số chỉ hỗ trợ trong url, không phải tên tệp cục bộ.

Vì vậy, tôi nghĩ bạn cần kiểm tra mã lưu url đính kèm hình ảnh, cần loại trừ các tham số và chỉ tên tệp. Và đảm bảo tên giống hệt như tệp được lưu vào đĩa.

Và bạn có thể cố gắng để mở file mặc dù IRB trực tiếp và kiểm tra kết quả:

>>> irb 
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022') 

Những người khác, cố gắng để tìm ra vị trí lỗi trong send_file, và đánh dấu vào tên tập tin.

Tôi vẫn không thể chắc chắn vấn đề thực sự là gì, chỉ cần một số gợi ý.

+0

Đó là gợi ý tốt .. –

2

Chỉ cần thay đổi phương pháp URL bằng đường dẫn:?

send_file @image.attachment.path # this is the right way!. 
Các vấn đề liên quan