как заставить send_data скачать файл в браузере? - PullRequest
4 голосов
/ 07 сентября 2011

Ну, моя проблема в том, что я использую send_data в своем приложении Rails 3, чтобы отправить пользователю файл из службы AWS S3 с чем-то вроде

Base.establish_connection!( :access_key_id => 'my_key', :secret_access_key => 'my_super_secret_key')
s3File = S3Object.find dir+filename, "my_unique_bucket"
send_data(open(s3File.url).read,:filename=>filename, :disposition => 'attachment')

но похоже, что браузер буферизует файл и перед буферизацией отправляет файл на скачивание, не тратя время на загрузку, но в buffering время занимает столько же времени, сколько размер файла .... но что мне нужно если пользователь просматривает процесс загрузки в обычном режиме, он не будет знать, что происходит с загрузчиком, только на вкладке браузера:

enter image description here

Они скорее увидят процесс загрузки, я думаю, чтобы выяснить, что там что-то происходит

Есть ли способ, которым я могу сделать это с send_data?

Ответы [ 2 ]

6 голосов
/ 07 сентября 2011

Буферизирует / задерживает не браузер, а код вашего сервера Ruby.

Вы загружаете весь файл с S3 перед отправкой его обратно пользователю в качестве вложения.

Может быть, лучше передать этот контент своему пользователю непосредственно из S3 с помощью перенаправления. Вот ссылка на создание временных URL-адресов доступа, которые позволят загружать с данным токеном в течение короткого периода времени:

http://docs.amazonwebservices.com/AmazonS3/latest/dev/S3_QSAuth.html

Base.establish_connection!( :access_key_id => 'my_key', :secret_access_key => 'my_super_secret_key')
s3File = S3Object.find dir+filename, "my_unique_bucket"
redirect_to s3File.url(:expires_in => 30)
0 голосов
/ 18 апреля 2014

Настройте свой контент

Вам нужно установить расположение контента для S3-URL для его загрузки вместо открытия в браузере. Вот моя основная реализация:

Думайте о attachment как о s3file.

В вашем attachment.rb

def download_url
  s3 = AWS::S3.new.buckets[ 'bucket_name' ]

  s3.url_for( :read,
    expires_in: 60.minutes, 
    use_ssl: true, 
    response_content_disposition: "attachment; filename='#{file_name}'" ).to_s
end

В ваших взглядах

<%= link_to 'Download Avicii by Avicii', attachment.download_url %>

Спасибо Гильеве за его руководство.

...