2013-07-14 14 views
5

Nella mia app per rotaie, sto utilizzando Carrierwave per caricare immagini su Amazon S3. Mi piacerebbe indicare le immagini esistenti di Amazon S3 senza dover ricaricare l'immagine. Ad esempio, se ho un'immagine Amazon S3 esistente su http://test.s3.amazonaws.com/image/path/0001/image.jpg, posso aggiornare il percorso di un'immagine per puntare a questa immagine? Non voglio usare l'opzione di caricamento remoto perché voglio solo usare la stessa esatta immagine già presente (ma salvarla nell'attributo "percorso" del mio record).carrierwave: punta a immagine esistente

Nella console, ho provato:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg") 

ma questo non riesce a ignorare il percorso dell'immagine.

+0

Come è stato possibile risolvere questo problema? – Mohamad

+0

Ho finito per non creare un nuovo record e semplicemente puntando al record originale. – scientiffic

+0

hi @scientiffic hai trovato una soluzione per questo? Sono molto interessante – medBo

risposta

0

ho scoperto che si può effettivamente fare questo, ad esempio, se il vostro mount_uploader è :path, quindi:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg" 
image.save 
+0

Grazie per la risposta. Come ho menzionato nel mio post originale, non volevo ricaricare il file, che credo sia quello che stai facendo con remote_path_url e salvare. – scientiffic

+0

Qualche motivo per cui non vuoi caricare nuovamente il file? Nel mio caso, sostituirà il file esistente ed è ancora più veloce piuttosto che caricare dal computer locale. Sfortunatamente non vedo nessun modo alternativo per carrierwave senza farlo. – shinnyx

+0

Ho scoperto che il nuovo caricamento del file era troppo lento per la mia applicazione. Invece, rilevo solo se il nuovo record punta a un'altra immagine e sostituisce l'immagine nella vista (piuttosto che nel mio database). – scientiffic

2

Sono un po 'in ritardo alla festa, ma è possibile utilizzare Active Record metodo raw_write_attribute qualcosa di simile:

@ image.raw_write_attribute (: percorso, "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

+0

Per quanto posso dire, questo non salva il valore nel DB e non consente nemmeno di scriverlo nel DB con @ image.save, perché per quanto riguarda il modello, non c'è nulla da salvare! – Daniel

3

rintocchi, meglio tardi che mai! Caveat: Questo è per rails 4, e sto testando su rail 4.1 solo al momento.

Questo è più difficile di quanto dovrebbe essere, mi sembra! Il motivo per cui questo è stato assolutamente cruciale per me è che sto allegando file da 100 MB + MP3, che non posso ricevere sul mio host, a causa delle limitazioni di CloudFlare SSL (e del buon senso). Fortunatamente, AWS supporta i caricamenti preauthorized, e ho avuto carrierwave di fare la cosa giusta per me:

Fase 1: ottenere carrierwave di dirmi dove sarebbe memorizzare un file se potesse:

m.raw_write_attribute('file','file.mp3'); 
url = m.file.url 
signed = aws_presigned_url(url) 

raw_write_attribute fa non salvare nulla, ignora semplicemente carrierwave quando imposta il valore. Ciò fa agire l'oggetto come se leggesse 'file.mp3' fuori dal database. Quindi puoi chiedere a Carrierwave "dove vive il file". Quindi caricare il file direttamente dal client su S3. Fatto questo, faccio un'altra chiamata API per Rails, che esegue il seguente codice:

m.raw_write_attribute('file','file.mp3'); 
m.update_attribute('file','file.mp3'); 

Questi due get abbinato intorno Carrierwave. Il primo fa sì che carrierwave pensi che la colonna 'file' sia impostata su 'file.mp3', la seconda dice esplicitamente ai binari di persistere 'file.mp3' nel DB. A causa della chiamata raw_write_attribute, Carrierwave consente il secondo tramite non modificato.

2

Nel mio caso update_column e update_columns funzionava benissimo:

model.update_columns file_1: 'filename.txt' 

colonna Update è con virgola:

model.update_column :file_1, 'filename.txt' 

Questo non verrà eseguito alcun richiamata e impostare colonna filename.txt.

Quando faccio model.file_1.url ottengo l'URL S3 giusto.

Problemi correlati