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.