스트리밍 및 파일 다운로드에 가장 적합한 것은 무엇입니까?
예를 들어주세요.
답변
send_data(_data_, options = {})
send_file(_path_, options = {})
여기서 가장 큰 차이점은 send_data 와 함께 DATA (이진 코드 등)를 전달 하거나 send_file 과 함께 파일 PATH 를 전달한다는 것 입니다.
따라서 일부 데이터를 생성하고 send_data 를 통해 서버에 파일을 생성하지 않고 인라인 텍스트 또는 첨부 파일로 보낼 수 있습니다. 또는 send_file 로 준비된 파일을 보낼 수 있습니다.
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
또는
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
성능을 위해 파일을 한 번 생성 한 다음 원하는만큼 여러 번 보내는 것이 좋습니다. 그래서 send_file
더 잘 맞을 것입니다.
내가 이해하는 한 스트리밍의 경우이 두 가지 방법 모두 동일한 옵션과 설정을 사용하므로 X-Send 등을 사용할 수 있습니다.
UPD
send_data 및 저장 파일 :
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
답변
send_file이 send_data보다 빠를 수 있습니다.
마찬가지로 fl00r 언급 , send_file
경로 및 소요 send_data
데이터.
따라서 파일 시스템에 파일이 필요 하므로 send_file
의 하위 집합입니다 send_data
. 물론 파일을 읽고 사용할 send_data
수 있습니다. 그러나 send_file
더 빠를 수 있으므로 성능 / 일반성 절충입니다.
send_file
경로를 알고 있기 때문에 파일 내용 대신 X-Sendfile
Apache ( X-Accel-Redirect
Nginx) 에서 헤더를 보낼 수 있기 때문에 더 빠를 수 있습니다 .
이 헤더는 일반적으로 프로덕션 설정에서 Rails 앞에서 실행되는 역방향 프록시 (Apache 또는 Nginx)에 의해 사용됩니다.
이 X-Sendfile
응답에있는 경우 역방향 프록시는 현재 응답의 대부분을 무시하고 지정된 경로에서 파일을 반환하는 새 응답을 빌드합니다.
Client <---> Internet <---> Reverse proxy <---> Rails
리버스 프록시는 정적 파일을 제공하는 데 매우 특화되어 있고 Rails ( X-Sendfile
전송 될 경우 파일 데이터를 전송하지 않음)보다 훨씬 빠르게 수행 할 수 있기 때문에 훨씬 효율적 입니다.
의 일반적인 사용 사례는 send_file
정적 파일의 액세스 권한을 제어하려는 경우입니다. 파일을 아래에 둘 수 없으며 /public
그렇지 않으면 Rails가 결정할 기회가 있기 전에 제공됩니다. 이것은 Rails 앱에서 public / in 콘텐츠 보호 에서 논의됩니다.
X-Sendfile
헤더 를 사용하려면 다음을 추가해야합니다.
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
에 config/initializers/production.rb
(또는 config/environment/production.rb
레일 5.x의에서), 하지 application.rb
, 개발에 프록시 서버가없는 당신이 원하기 때문에 send_file
실제로 데이터를 전송 할 수 있습니다.
X-Sendfile
자산 파이프 라인 가이드 에서 논의됩니다 .