2013-07-14 12 views
5

W mojej aplikacji rails używam Carrierwave do przesyłania zdjęć na Amazon S3. Chciałbym wskazać istniejące obrazy Amazon S3 bez konieczności ponownego przesyłania obrazu. Na przykład, jeśli mam istniejący obraz Amazon S3 pod adresem http://test.s3.amazonaws.com/image/path/0001/image.jpg, czy mogę zaktualizować ścieżkę obrazu, aby wskazać ten obraz? Nie chcę używać opcji zdalnego wysyłania, ponieważ naprawdę chcę tylko użyć tego samego obrazu, który już tam jest (ale zapisz go w atrybucie "ścieżka" mojego rekordu).carrierwave: wskaż istniejący obraz

W konsoli Próbowałem:

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

ale to się nie powiedzie, aby zastąpić ścieżkę obrazu.

+0

Jak udało się rozwiązać ten problem? – Mohamad

+0

Skończyło się na tym, że nie tworzyłem nowej płyty i tylko wskazywałem na oryginalną płytę. – scientiffic

+0

hi @ scientogiffic czy znalazłeś rozwiązanie? Jestem bardzo interesujący – medBo

Odpowiedz

0

Okazało się, że rzeczywiście można to zrobić, na przykład jeśli mount_uploader jest :path, a następnie:

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

Dziękuję za odpowiedź. Jak wspomniałem w moim oryginalnym wpisie, nie chciałem ponownie przesyłać pliku, który, jak sądzę, jest tym, co robisz z remote_path_url i zapisujesz. – scientiffic

+0

Każdy powód, dla którego nie chcesz ponownie przesyłać pliku? W moim przypadku zastąpi on istniejący plik i jest jeszcze szybszy, zamiast przesyłać z lokalnego komputera. Niestety nie widzę żadnych alternatywnych sposobów dla nosiciela bez tego. – shinnyx

+0

Znalazłem, że ponowne przesłanie pliku było zbyt wolne dla mojej aplikacji. Zamiast tego, właśnie wykrywam, czy nowy rekord wskazuje na inny obraz i zastępuje obraz w widoku (a nie w mojej bazie danych). – scientiffic

2

jestem trochę późno do partii, ale można użyć metody raw_write_attribute coś Active Record niczym:

@ image.raw_write_attribute (: ścieżka "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

+0

O ile mogę powiedzieć, nie zapisuje to wartości do DB, a nawet nie pozwala na zapisanie go do DB z @ image.save, ponieważ jeśli chodzi o model, nie ma nic do zapisać! – Daniel

3

Chiming w, lepiej późno niż wcale! Zastrzeżenie: Dotyczy to torów 4, a obecnie testuję tylko na szynach 4.1.

To jest trudniejsze niż być powinno, metinks! Powodem, dla którego było to dla mnie absolutnie kluczowe, było to, że dołączam pliki MP3 100MB +, których nie mogę odbierać na moim hoście, z powodu ograniczeń CloudFlare SSL (i zdrowego rozsądku). Na szczęście, AWS obsługuje preauthorized przesłane, i mam carrierwave aby zrobić dobry uczynek dla mnie:

Krok 1: zdobycie carrierwave mi powiedzieć, gdzie to zapisać plik, jeśli to może:

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

raw_write_attribute robi nic nie zapisuje, po prostu pomija falę nośną podczas ustawiania wartości. To sprawia, że ​​obiekt działa tak, jakby odczytał "plik.mp3" z bazy danych. Następnie możesz zapytać Carrierwave, "gdzie plik żyje". Przesyłam plik bezpośrednio z klienta do S3. Kiedy to zrobił, ja dokonać innego wywołania API do szyny, która wykonuje następujący kod:

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

Te dwa sparowane obejść Carrierwave. Pierwszy sprawia, że ​​firma carrierwave uważa, że ​​kolumna "plik" jest ustawiona na "plik.mp3", a druga jawnie nakazuje szynom, aby utrzymywały "plik.mp3" w bazie danych. Ze względu na wywołanie raw_write_attribute, Carrierwave pozwala na drugą bez zmian.

2

W moim przypadku update_column i update_columns pracował wielki:

model.update_columns file_1: 'filename.txt' 

Aktualizacja kolumna jest z przecinkiem:

model.update_column :file_1, 'filename.txt' 

To nie będzie działać dowolny zwrotnego i ustawić kolumnę filename.txt.

Po wykonaniu model.file_1.url otrzymuję właściwy adres URL S3.

Powiązane problemy