Cái nào tốt nhất để phát trực tuyến và tải tệp xuống?
Vui lòng cung cấp các ví dụ.
Câu trả lời:
send_data(_data_, options = {})
send_file(_path_, options = {})
Sự khác biệt chính ở đây là bạn chuyển DATA (mã nhị phân hoặc bất cứ thứ gì) với send_data hoặc tệp PATH với send_file .
Vì vậy, bạn có thể tạo một số dữ liệu và gửi nó dưới dạng văn bản nội tuyến hoặc dưới dạng tệp đính kèm mà không cần tạo tệp trên máy chủ của bạn qua send_data . Hoặc bạn có thể gửi tệp đã sẵn sàng với send_file
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
Hoặc là
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Đối với hiệu suất, tốt hơn là tạo tệp một lần và sau đó gửi nó nhiều lần tùy thích. Như vậy send_file
sẽ phù hợp hơn.
Đối với phát trực tuyến, theo như tôi hiểu, cả hai phương pháp này đều sử dụng cùng một loạt các tùy chọn và cài đặt, vì vậy bạn có thể sử dụng X-Send hoặc bất cứ điều gì.
UPD
send_data và lưu tệp:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
.
send_file
tôi phải sử dụng chính tệp đó, không phải đường dẫn để nó hoạt động. Chỉ muốn cập nhật trong trường hợp những người khác gặp phải vấn đề này?
send_file có thể nhanh hơn send_data
Như fl00r đã đề cập , send_file
có một đường dẫn và send_data
dữ liệu.
Do đó, send_file
là một tập hợp con của send_data
, khi bạn cần một tệp trên hệ thống tệp: tất nhiên bạn có thể chỉ cần đọc tệp và sử dụng send_data
trên đó. Nhưng send_file
có thể nhanh hơn, vì vậy nó là một sự đánh đổi hiệu suất / tính tổng quát.
send_file
có thể nhanh hơn vì nó có thể gửi X-Sendfile
tiêu đề trên Apache ( X-Accel-Redirect
trên Nginx) thay vì nội dung tệp, vì nó biết đường dẫn.
Tiêu đề này được sử dụng bởi proxy ngược (Apache hoặc Nginx) thường chạy trước Rails trong thiết lập sản xuất.
Nếu X-Sendfile
có trên phản hồi, proxy ngược sẽ bỏ qua hầu hết phản hồi hiện tại và tạo một phản hồi mới trả về tệp theo đường dẫn đã cho.
Client <---> Internet <---> Reverse proxy <---> Rails
Điều này hiệu quả hơn nhiều vì proxy ngược rất chuyên biệt trong việc phục vụ các tệp tĩnh và có thể thực hiện nhanh hơn nhiều so với Rails (không gửi dữ liệu tệp nếu X-Sendfile
được gửi).
Trường hợp sử dụng điển hình send_file
là khi bạn muốn kiểm soát quyền truy cập của các tệp tĩnh: bạn không thể đặt chúng dưới quyền /public
hoặc nếu không chúng sẽ được phục vụ trước khi Rails có cơ hội quyết định. Điều này được thảo luận tại: Bảo vệ nội dung công khai / trong ứng dụng Rails
Để sử dụng các X-Sendfile
tiêu đề, bạn phải thêm:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
đến config/initializers/production.rb
(hoặc config/environment/production.rb
trong Rails 5.x), không application.rb
, vì trong phát triển bạn không có một máy chủ proxy và bạn muốn send_file
để thực sự gửi dữ liệu.
X-Sendfile
được thảo luận trên Hướng dẫn về đường ống nội dung .