[ruby-on-rails] Ruby on Rails에서 send_data와 send_file의 차이점은 무엇입니까?

스트리밍 및 파일 다운로드에 가장 적합한 것은 무엇입니까?

예를 들어주세요.



답변

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-SendfileApache ( X-Accel-RedirectNginx) 에서 헤더를 보낼 수 있기 때문에 더 빠를 수 있습니다 .

이 헤더는 일반적으로 프로덕션 설정에서 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자산 파이프 라인 가이드 에서 논의됩니다 .


답변