rails imagen image_tag ruby-on-rails download amazon-s3

ruby-on-rails - imagen - rails image_tag max height



Rieles: permite la descarga de archivos almacenados en S3 sin mostrar la URL S3 real al usuario (3)

Primero necesitas crear un CNAME en tu dominio, como explicar here .

Segundo, necesitas crear un cubo con el mismo nombre que colocaste en CNAME.

Y para terminar, necesita agregar estas configuraciones en su config / initializers / carrierwave.rb:

CarrierWave.configure do |config| ... config.asset_host = ''http://bucket_name.your_domain.com'' config.fog_directory = ''bucket_name.your_domain.com'' ... end

Tengo una aplicación de Rails alojada en Heroku. La aplicación genera y almacena archivos PDF en Amazon S3. Los usuarios pueden descargar estos archivos para verlos en su navegador o guardarlos en su computadora.

El problema que tengo es que aunque la descarga de estos archivos es posible a través de la URL S3 (como "https://s3.amazonaws.com/my-bucket/F4D8CESSDF.pdf"), obviamente NO es una buena manera de hacerlo eso. No es deseable exponer al usuario tanta información sobre el back-end, sin mencionar los problemas de seguridad que surgen.

¿Es posible que mi aplicación recupere de alguna manera los datos del archivo de S3 en un controlador y luego cree una secuencia de descarga para el usuario, para que la URL de Amazon no quede expuesta?


Puede crear sus objetos s3 como privados y generar urls públicas temporales para ellos con el método url_for (aws-s3 gem). De esta forma, no se transmiten archivos a través de los servidores de la aplicación, que es más escalable. También permite poner una autorización basada en la sesión (por ejemplo, idear en su aplicación), rastrear eventos de descarga, etc.

Para hacer esto, cambie los enlaces directos a los archivos alojados s3 en enlaces a controlador / acción que crea url temporal y lo redirecciona. Me gusta esto:

class HostedFilesController < ApplicationController def show s3_name = params[:id] # sanitize name here, restrict access to only some paths, etc AWS::S3::Base.establish_connection!( ... ) url = AWS::S3::S3Object.url_for(s3_name, YOUR_BUCKET, :expires_in => 2.minutes) redirect_to url end end

El ocultamiento del dominio de Amazon en las URL de descarga generalmente se realiza con alias de DNS. Necesita crear un registro CNAME aliasing su subdominio , por ejemplo, downloads.mydomain , a s3.amazonaws.com . A continuación, puede especificar :server opción de :server en AWS::S3::Base.establish_connection!(:server => "downloads.mydomain", ...) y S3 gem lo usará para generar enlaces.


Sí, esto es posible: simplemente busque el archivo remoto con Rails y guárdelo temporalmente en su servidor o envíelo directamente desde el búfer. El problema con esto es, por supuesto, el hecho de que necesita recuperar el archivo antes de poder servirlo al usuario. Vea este hilo para una discusión, su solución es algo como esto:

#environment.rb require ''open-uri'' #controller def index data = open(params[:file]) send_data data, :filename => params[:name], ... end

Este problema también está relacionado de alguna manera .