我有一个rails应用程序,为注册用户提供大量的静态文件。 我可以通过遵循以下优秀指南来实现它: 使用nginx,Rails 3.0和#send_file进行受保护的下载 。 下载和其他一切都工作得很好,但只是这个问题 – Content-Length
头没有被发送。
小文件没问题,但是下载大文件会让人感到非常沮丧,因为下载pipe理器和浏览器没有显示任何进度。 我怎样才能解决这个问题? 我必须添加一些东西到我的nginx
configuration,或者我必须传递一些其他选项到我的轨道控制器中的send_file
方法吗? 我一直在网上search相当一段时间,但一直不成功。 请帮忙! 谢谢!
这是我的nginx.conf
:
upstream unicorn { server unix:/tmp/unicorn.awesomeapp.sock fail_timeout=0; } server { listen 80 default_server deferred; # server_name example.com; root /home/deploy/apps/awesomeapp/current/public; location ~ /downloads/(.*) { internal; alias /home/deploy/uploads/$1; } location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Sendfile-Type X-Accel-Redirect; proxy_set_header X-Accel-Mapping /downloads/=/home/deploy/uploads/; proxy_pass http://unicorn; } error_page 500 502 503 504 /500.html; client_max_body_size 20M; keepalive_timeout 10; }
好的,这是一些东西。 我不知道是否是正确的方式,但我能够通过从我的Rails Controller
手动发送Content-Length
标题来解决这个问题。 这是我正在做的事情:
def download @file = Attachment.find(params[:id]) response.headers['Content-Length'] = @file.size.to_s send_file(@file.path, x_sendfile: true) end
nginx
应该可以自动设置标题。 必须有我失踪的东西; 但直到我找到一个“正确”的解决方案,我想这将不得不做。
PS:标题需要是一个字符串才能正常使用一些网络服务器,因此.to_s