ruby-on-rails ruby file ftp download

ruby on rails - Ruby-Rails sirve archivo ftp directo al cliente



ruby-on-rails file (2)

Soy nuevo en ruby ​​y en rieles, así que disculpe mi pregunta ... Lo que quiero saber es cómo tomar un archivo de un servidor ftp con ruby ​​sin guardar el archivo en mi disco duro de la aplicación Rails (transmitir los datos del archivo directamente al cliente). Estoy trabajando con la clase Ruby Net / FTP.

Con el método "retrbinary" de la clase Net / FTP tengo el siguiente fragmento de código:

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

En mi vista de carriles, puedo hacer algo como esto:

send_data( buf )

Entonces, ¿cómo puedo combinar estos dos? No sé cómo instalar un objeto de memoria intermedia, completar la transmisión y luego notificarlo al usuario. ¿Alguien tiene una idea de cómo hacer esto?


¡Muchas gracias por tu apoyo! Tu publicación me ayuda a continuar. Después de algunas tazas de café encontré una solución de trabajo. En realidad, estoy haciendo lo siguiente, que funciona para mí:

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

Voy a probar esto en producción (situación de la vida real). Si esto no funciona lo suficientemente bien, tengo que usar un montaje NFS.

aleta


¿Quieres lo siguiente?

1) El cliente (navegador) envía una solicitud al servidor de Rails

2) El servidor debe responder con el contenido de un archivo que se encuentra en un servidor ftp.

¿Es asi?

Si es así, simplemente redirija el navegador a la ubicación de ftp. P.ej

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

Lo anterior funciona si el archivo ftp tiene acceso anónimo.

Si realmente necesita acceder al archivo desde el servidor y transmitirlo, intente lo siguiente:

# 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 }

Debería verificar los encabezados en la respuesta para ver si son lo que quiere.

PD. La configuración de la conexión ftp y la transmisión desde un segundo servidor probablemente será relativamente lenta. Usaría JS para mostrar un gráfico ocupado al usuario.

Intentaría alternativas a ftp. ¿Puede configurar una conexión NFS o montar el disco remoto? Sería mucho más rápido que ftp. También investigue tamaños de ventana TCP grandes.