I'm having trouble playing a video from my site on the iphone using send_file. It seems that I'm missing the Accept-Ranges header in my response. How can I set the Accept-Ranges header in my send_file response?
I actually was able to edit the source of rails to get this implemented:
vendor/rails/actionpack/lib/action_controller/streaming.rb
def send_file_headers!(options) options.update(DEFAULT_SEND_FILE_OPTIONS.merge(options)) [:length, :type, :disposition].each do |arg| raise ArgumentError, ":#{arg} option required" if options[arg].nil? end
disposition = options[:disposition].dup || 'attachment'
disposition <<= %(; filename="#{options[:filename]}") if options[:filename]
headers.update( 'Content-Length' => options[:length], 'Content-Type' => options[:type].to_s.strip, # fixes a problem with extra '\r' with some browsers 'Content-Disposition' => disposition, 'Content-Transfer-Encoding' => 'binary' )
headers.update('Accept-Ranges' => options['Accept-Ranges']) if options['Accept-Ranges']
# Fix a problem with IE 6.0 on opening downloaded files: # If Cache-Control: no-cache is set (which Rails does by default), # IE removes the file it just downloaded from its cache immediately # after it displays the "open/save" dialog, which means that if you # hit "open" the file isn't there anymore when the application that # is called for handling the download is run, so let's workaround that headers['Cache-Control'] = 'private' if headers['Cache- Control'] == 'no-cache' end
And I send my file like this:
send_file path, :disposition => 'inline', :type => m_type, 'Accept- Ranges' => 'bytes'
In retrospect this was dumb because mongrel doesn't even support byte- range requests....