send_data(_data_, options = {})
send_file(_path_, options = {})
Główna różnica polega na tym, że przekazujesz DANE (kod binarny lub cokolwiek) za pomocą send_data lub file PATH za pomocą send_file .
Możesz więc wygenerować dane i wysłać je jako tekst w tekście lub jako załącznik bez generowania pliku na serwerze za pośrednictwem send_data . Lub możesz wysłać gotowy plik za pomocą send_file
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
Lub
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Dla wydajności lepiej jest wygenerować plik raz, a następnie wysłać go tyle razy, ile chcesz. Więc send_file
będzie lepiej pasować.
W przypadku przesyłania strumieniowego, o ile rozumiem, obie te metody używają tych samych opcji i ustawień, więc możesz użyć X-Send lub cokolwiek innego.
UPD
send_data i zapisz plik:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
.send_file
musiałem użyć samego pliku, a nie ścieżki, aby działał. Chciałeś tylko zaktualizować na wypadek, gdyby inni to zetknęli?send_file może być szybszy niż send_data
Jak wspomniałem fl00r ,
send_file
pobiera ścieżkę isend_data
dane.Dlatego
send_file
jest to podzbiórsend_data
, ponieważ potrzebujesz pliku w systemie plików: możesz oczywiście po prostu przeczytać plik i użyćsend_data
na nim. Alesend_file
może być szybszy, więc jest to kompromis między wydajnością a ogólnością.send_file
może być szybszy, ponieważ może wysłaćX-Sendfile
nagłówek na Apache (X-Accel-Redirect
na Nginx) zamiast zawartości pliku, ponieważ zna ścieżkę.Ten nagłówek jest używany przez odwrotne proxy (Apache lub Nginx), które normalnie działa przed Railsami w konfiguracji produkcyjnej.
Jeśli
X-Sendfile
w odpowiedzi występuje, odwrotny serwer proxy ignoruje większość bieżącej odpowiedzi i tworzy nowy, który zwraca plik w podanej ścieżce.Jest to znacznie wydajniejsze, ponieważ odwrotne proxy jest wysoce wyspecjalizowane w obsłudze plików statycznych i może to zrobić znacznie szybciej niż Railsy (które nie wysyłają danych pliku, jeśli
X-Sendfile
zostaną wysłane).Typowym przypadkiem użycia
send_file
jest sytuacja, gdy chcesz kontrolować prawa dostępu do plików statycznych: nie możesz ich/public
przypisać, bo inaczej zostałyby obsłużone, zanim Railsy miałyby szansę zdecydować. Jest to omówione w: Ochrona zawartości publicznej / w aplikacji RailsowejAby skorzystać z
X-Sendfile
nagłówków, musisz dodać:config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
do
config/initializers/production.rb
(lubconfig/environment/production.rb
w Railsach 5.x), nieapplication.rb
, ponieważ w fazie rozwoju nie masz serwera proxy i chceszsend_file
faktycznie wysłać dane.X-Sendfile
jest omówione w przewodniku po strukturze aktywów .źródło