2011-02-15 9 views
24

que tienen modelo de vídeo con la siguiente definición:¿Cómo asignar un archivo remoto a Carrierwave?

class Video 
    require 'carrierwave/orm/activerecord' 
    mount_uploader :attachment, VideoUploader 
    mount_uploader :attachment_thumbnail, VideoThumbnailUploader 
    ... 
end 

Al cargar un archivo de vídeo. También envía el archivo a nuestro servicio de codificación Zencoder, que codifica el archivo de video y crea una miniatura para él.

Normalmente, podría hacer algo como @ video.attachment.url, que devolverá la ruta del archivo de video. Me gustaría hacer lo mismo con la miniatura. es decir @ video.attachment_thumbnail.url

Sin embargo, dado que el archivo adjunto es creado por nuestro servicio de codificación, que también lo carga a un contenedor S3 específico. ¿Cómo asigno el archivo adjunto a la columna attachment_thumbnail para el registro?

¿Puedo simplemente hacer algo como:

@video.update_attributes(
    :attachment_thumbnail => 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png' 
) 

¿Es posible asignar archivos como este para Carrierwave?

+0

Ves Railscasts, ¿verdad? ;) ¿Usaste paperclip antes? ¿Cuál prefieres? – Robin

+1

Hola Robin, intenté Paperclip. Prefiero Carrierwave. Solo una preferencia personal :-) –

+1

Mira la respuesta aquí. update_column omite las devoluciones de llamada, lo que le permite actualizar el atributo sin que CarrierWave vuelva a cargar la imagen. http://stackoverflow.com/questions/16968658/how-do-i-add-files-already-stored-on-s3-to-carrierwave-backed-by-same-datastore?rq=1 – pejmanjohn

Respuesta

49

Usted puede hacer lo siguiente:

@video.remote_attachment_thumbnail_url = 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png' 

Pero eso va a causar Carrierwave descargar + volver a procesar el archivo en lugar de hacerlo en la miniatura. Si no va a utilizar el procesamiento de Carrierwave, entonces puede que tenga más sentido almacenar la URL en la miniatura del modelo en lugar de usar Carrierwave.

+1

¿Por qué "@ vídeo.remote_attachment_thumnail_url "causa Carrierwave para descargar + reprocesar el archivo? –

+1

Le está diciendo a carrierwave que tome el archivo desde allí en lugar de cargar el archivo. Generalmente se usa en formularios para que el usuario ingrese una URL a una imagen que tenían me gusta subir. – ctide

+0

ctide, acabo de probar: @ video.update_attributes (: attachment_thumbnail => 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png') y yo get: CarrierWave :: FormNotMultipart: CarrierWave :: FormNotMultipart. Supongo que no puedes hacer @ video.remote_attachment_thumnail_url = 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png ', que es simplemente lo mismo. ¿O me falta algo? –

11

Esto funcionó para mí, con CarrierWave 0.5.8

model.update_attributes(:remote_uploader_url => "http://path/to/image.jpg") 

Por supuesto, es necesario establecer remote_uploader_url ser attr_accessible para esto.

0

Yo estaba buscando esto también.

El punto de bloqueo en el caso de zencoder sería que Carrierwave no rastrea diferentes versiones de tipos de archivos para el archivo original. Solo hace referencia al archivo original.

Por lo tanto, teniendo el archivo original como .mp4 una versión en miniatura como .png no funciona. Si bien puede tener un 'image.png' y también rastrear 'thumb_png_image.png', tampoco puede crear un 'thumb_jpg_image.jpg' para el mismo archivo.

De lo contrario, podría crear una versión ficticia y usar versiones condicionales le indicará a CW que no la procese. Como CW crearía la versión ficticia de todos modos pero no la cargaría, podría hacer que haga referencia a una ruta que coincida con el archivo devuelto por Zencoder. Pero bueno ...

Cuestiones relacionadas