2011-07-20 6 views
12

Tôi có một trình trợ giúp liên kết đến Rails tải xuống hình nền khi được nhấp. Nhưng hình ảnh đang tải trong trình duyệt thay vì được tải xuống ngay lập tức.Rails 'link_to' để tải xuống hình ảnh ngay lập tức thay vì mở nó trong trình duyệt

<%= link_to "1920x1080", @download.wallpapers[1].wallpaper.url %> 

Nhưng đồng thời tôi có một liên kết để trợ giúp Rails tải xuống định dạng bảo vệ màn hình .exe nhưng ở đây nó hoạt động như inteded: tệp đang được tải xuống ngay lập tức.

<%= link_to "720p", @download.screensavers.first.screensaver.url %> 

Tôi nên thêm hoặc làm gì để hình ảnh sẽ không được mở trong trình duyệt mà thay vào đó sẽ được tải xuống ngay lập tức?

Cảm ơn!

+1

Khá chắc chắn đây là một vấn đề cụ thể trình duyệt, không phải là một vấn đề web-framework. Bạn không thể xem EXE trong trình duyệt nhưng bạn có thể xem hình ảnh. –

Trả lời

11

Nói chung, cách sạch nhất để làm điều này là để thiết lập các tiêu đề thích hợp khi gửi ảnh:

Content-Disposition: attachment; filename=&lt;file name.ext&gt; 

Phương pháp send_file sẽ cho phép bạn thiết lập tiêu đề này một cách thích hợp nếu bạn đang phục vụ các tập tin từ hệ thống tập tin:

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_file

Nếu tập tin được lưu trữ trong cơ sở dữ liệu, bạn có thể sử dụng thay vì send_data:

http://api.rubyonrails.org/classes/ActionController/Streaming.html#method-i-send_data

+0

:(14 giây trễ – vinceh

+0

Cảm ơn bạn đã trả lời! – neilmarion

13

Thay vì đặt liên kết của hình ảnh trong thẻ của bạn, bạn có thể xử lý nó trong bộ điều khiển của mình. Và sau đó trong bộ điều khiển của bạn, bạn có thể làm điều gì đó như

send_file @download.wallpapers[1].wallpaper.url, :type => 'image/jpeg', :disposition => 'attachment' 

đọc this

+0

Cảm ơn bạn đã trả lời !!! – neilmarion

+0

Đừng quên đánh dấu câu trả lời đúng :) – vinceh

+0

liên kết tốt hơn: http://apidock.com/rails/ActionController/DataStreaming/send_file – montrealmike

8

Rails 3/4:

trong các tuyến đường:

get "home/download_pdf" 

trong điều khiển:

def download_pdf 
    send_file(
    "#{Rails.root}/public/your_file.pdf", 
    filename: "your_custom_file_name.pdf", 
    type: "application/pdf" 
) 
end 

trong chế độ xem:

<%= link_to 'Download PDF', home_download_pdf_url %> 
+1

Điều gì sẽ xảy ra nếu liên kết được tạo trong lần lặp .each và tên tệp là động. –

25

Có cách dễ dàng hơn để thực hiện việc này với HTML5 download attribute.

<%= link_to 'Download existing avatar', @user.avatar(:original), download: "User_#{@user.id}_avatar" %> 
+2

Điều này chắc chắn nhất sẽ là câu trả lời được chấp nhận ngay bây giờ. – taylorthurlow

0

Dưới đây là một giải pháp đơn giản bằng cách sử dụng tải về thuộc tính HTML5 với kẹp giấy

<%= link_to item.name, item.asset.url, download: item.asset.original_filename %>