Ruby-Rails обслуживает FTP-файл напрямую клиенту - PullRequest
0 голосов
/ 16 сентября 2010

Я новичок в рубине и рельсах, так что извините за мой вопрос ... Я хочу знать, как взять файл с ftp-сервера с помощью ruby, не сохраняя файл на жестком диске моего приложения rails (потоковая передача данных напрямую клиенту) Я работаю с классом ruby ​​Net / FTP.

С методом «retrbinary» из класса Net / FTP у меня есть следующий фрагмент:

ftp.retrbinary('RETR ' + filename, 4096) { |data|
  buf << data
}

На мой взгляд, я могу сделать что-то вроде этого:

send_data( buf )

Так как мне объединить эти два? Я не знаю, как создать экземпляр объекта буфера, заполнить поток и затем передать его пользователю. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

большое спасибо за вашу поддержку! Ваш пост заставил меня продолжить. После нескольких чашек кофе я нашел рабочий раствор. На самом деле я делаю следующее, что работает для меня:

def download_file
  filename = params[:file]
  raw = StringIO.new('')
  @ftp.retrbinary('RETR ' + filename, 4096) { |data|
    raw << data
  }
  @ftp.close
  raw.rewind
  send_data raw.read, :filename => filename
end

Я опробую это на производстве (в реальной жизни). Если это не работает достаточно хорошо, я должен использовать NFS mount.

плавник

1 голос
/ 16 сентября 2010

Хотите следующее?

1) Клиент (браузер) отправляет запрос на сервер Rails

2) Сервер должен ответить содержимым файла, расположенного наftp server.

Это так?

Если это так, просто перенаправьте браузер в папку ftp.Например,

 # in controller
 ftp_url = "ftp://someserver.com/dir_name/file_name.txt
 redirect_to ftp_url

Вышеприведенное работает, если у ftp-файла есть анонимный доступ для доступа.

Если вам действительно нужен доступ к файлу с сервера и потоковая передача, попробуйте следующее:

# in controller
render :text => proc {|response, output|
  ftp_session = FTP.open(host, user, passwd, acct)
  ftp_session.gettextfile(remotefile) {|data| output.write(data)}
  ftp_session.close
  }

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

пс.Настройка соединения ftp и потоковой передачи со второго сервера, вероятно, будет относительно медленной.Я бы использовал JS, чтобы показать пользователю занятую графику.

Я бы попробовал альтернативы ftp.Можете ли вы установить соединение NFS или смонтировать удаленный диск?Будет намного быстрее, чем ftp.Также исследуйте большие размеры окна TCP.

...