Który z nich jest najlepszy do przesyłania strumieniowego i pobierania plików?
Proszę podać przykłady.
Odpowiedzi:
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ę i send_data
dane.
Dlatego send_file
jest to podzbiór send_data
, ponieważ potrzebujesz pliku w systemie plików: możesz oczywiście po prostu przeczytać plik i użyć send_data
na nim. Ale send_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.
Client <---> Internet <---> Reverse proxy <---> Rails
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 Railsowej
Aby 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
(lub config/environment/production.rb
w Railsach 5.x), nie application.rb
, ponieważ w fazie rozwoju nie masz serwera proxy i chcesz send_file
faktycznie wysłać dane.
X-Sendfile
jest omówione w przewodniku po strukturze aktywów .