вопрос о создании ссылки для скачивания - PullRequest
0 голосов
/ 25 марта 2009

Я новичок в Rails и работаю над проектом, в котором после входа в систему пользователь они могут щелкнуть ссылку, чтобы загрузить исполняемый файл (например, файл в http://test.com/test.exe). Я хочу сохранить ссылку на exe файл скрыт Каковы наилучшие способы реализации этого шага.

Я думал об использовании перенаправления на URL, но получаю ошибка, указывающая, что я не могу использовать два перенаправления в функции.

Кроме того, я думал об использовании NET: HTTP для использования HTTP-запроса, но у меня нет Идея, как это реализовать.

Спасибо !!

Ответы [ 4 ]

1 голос
/ 26 марта 2009

Похоже, никто не упомянул X-Sendfile.

Загрузка файлов выполнена правильно

1 голос
/ 25 марта 2009

Вы должны прочитать файл в своем коде и вывести его как есть клиенту. Отправьте перед этим соответствующие заголовки:

Content-type: application/octet-stream  
Content-Disposition: inline; filename=[file name you want the user to see]  
Content-length: [file size]  

Почему делать два перенаправления в одном месте плохо, это все равно, что пытаться управлять автомобилем в двух направлениях одновременно ...

Может быть лучше использовать

Content-Type: application/force-download

вместо

Content-type: application/octet-stream
0 голосов
/ 25 марта 2009

Я попробовал приведенный ниже код, просто пример exe-файла, но, похоже, код читает весь файл размером более 500 МБ. Я хочу, чтобы он просто дал мне возможность сохранить исполняемый файл. Спасибо!

  def download
    send_data(open('http://mirrors.gigenet.com/ubuntu/intrepid/ubuntu-8.10-desktop-i386.iso').read,
    :filename => 'ubuntu-8.10-desktop-i386.iso' ,
    :type => 'application/force-download',
    :disposition => 'attachment')
  end
0 голосов
/ 25 марта 2009

Для прокси файла через ваш контроллер вы можете использовать open-uri.

В среде. Rb

require 'open-uri'

В вашем контроллере

def download
  send_data(open(params[:url]).read,
    :filename => 'somefilename',
    :disposition => 'attachment'
  )
end

РЕДАКТИРОВАТЬ: Если вы не хотите, чтобы прокси файл, вы должны перенаправить на (URL). Если вы получаете сообщение о перенаправлении, вызванное дважды, имейте в виду, что вы не можете одновременно выполнять рендеринг и перенаправление из одного действия. Если вам нужно загрузить представление, а затем начать загрузку, используйте два действия:

def present_download
  @download = Download.find(params[:id])
  # implicitly calls render :action => :present_download
end

def download_file
  @download = Download.find(params[:id])
  respond_to do |format|
    format.html { redirect_to(@download.url) }
  end
end

И по вашему мнению (present_download.html.erb):

<html>
  <head>
    <meta http-equiv="refresh" content="1;url=<%= url_for :action => :download_file -%>" />
  </head>
  <body>
    Your download will automatically start…
…
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...