2011-01-21 2 views
3

Linode를 호스팅 솔루션으로 사용하고 있습니다. 나는 동적으로 mp3 (및 다른 미디어)를 취하고 다운로드 용 .zip 파일을 만드는 레일 3 응용 프로그램이 있습니다. 그것은 개발에 잘 작동하지만 zip 파일은 여전히 ​​다운로드하지만 압축을 풀면 foo-bar.zip.cpgz라는 파일이 생성됩니다.prod (Rails 3)에서 .zip 파일을 생성하는 데 문제가 발생했습니다.

내 컨트롤러의 코드 스 니펫 -

def get_zip 
    t = Tempfile.new("#{@foobar.slug}-#{request.remote_ip}.zip") 
    Zip::ZipOutputStream.open(t.path) do |zos| 
     @foobardownloads.each do |foobardownload| 
     extension = File.extname(foobardownload.foobardownload_file_name).gsub(/^\.+/, '') 
     zos.put_next_entry("#{foobardownload.title}.#{extension}") 
     zos.print open(foobardownload.foobardownload.url).read 
     end 
    end 
    send_file t.path, :x_sendfile => true, :type => 'application/zip', :filename => "#{@foobar.slug}.zip" 
    t.close 
    end 
+0

나는 또한 nginx를 사용하고 있다고 언급해야한다. – BandsOnABudget

+0

예외가 발생할 경우 임시 파일을 닫으려면 begin/ensure/end 블록을 사용해야합니다. 또한, tempfile ('t.unlink')을 닫은 후에 (다시 말하면 확실한 절에서) 파일의 연결을 해제해야합니다. – skalee

답변

6

확인 - 파고의 비트를했다 -이 사실은 레일 3의 nginx, & send_file/w 문제였다. 이 솔루션은 여기에 있습니다 :

http://www.novafist.com/2010/09/send_file-sends-0-bytes-to-client-in-rails/

은 "신속하고 더러운"해킹

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' 

가 있는지 확인하여 production.rb 파일과 주석이 줄을 열 수있을 것

#config.action_dispatch.x_sendfile_header = "X-Sendfile" 

은 여전히 ​​주석 처리됩니다.

+0

그 변경 사항은 Apache2에서도 작동하는 것으로 보입니다. 재귀 적으로 압축 된 zip 파일과 동일한 문제가있었습니다. 이것은 나를 위해 고정 된 것들을 바꾼다. – samullen

+0

노바 피스트 사이트가 다운되었지만 해결책이이 답변에 포함되어 있습니다. 해킹이 아니라 올바르게 구성하는 것입니다. –

관련 문제