2010-11-03 19 views
13

Mam plik rake, który odczytuje zawartość za pośrednictwem protokołu HTTP i chcę użyć Paperclip do przechowywania załadowanych treści na Amazon S3. Działa dobrze, gdy udostępniam plik lokalny, ale chciałbym ustawić zawartość jako ciąg i ręcznie ustawić typ zawartości.Jak używać spinacza bez pliku, tylko za pomocą sznurka?

Poniższe nie działają. Błąd nie jest wydawane, wpis Baza jest aktualizowana, ale plik nie jest tworzony w S3:

p.attachment = "Test" 
p.attachment_file_name = "test.txt" 
p.attachment_content_type = "text/plain" 
p.attachment_file_size = "Test".size 
p.attachment_updated_at = Time.now 
p.save 

Chyba mógłbym napisać plik tymczasowy z moim treści, ale to byłoby dość nieefektywne rozwiązanie.

Odpowiedz

2

Nie, musisz utworzyć plik ze swoim ciągiem znaków.

Wystarczy spojrzeć na kod źródłowy spinacza: https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L77 i https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/iostream.rb#L5

kiedy coś przypisać użyciu my_model.attachment =, Spinacz chce obiekt pliku.

+0

To niefortunne. Czy myślisz, że powinienem użyć czegoś innego niż Paperclip? Chciałbym mieć szansę na łatwe przejście z S3 na system plików, ale nie mam żadnych plików użytkownika, więc Paperclip może być złym wyborem. – Jan

+1

czy spojrzał na przewoźnika: https://github.com/jnicklas/carrierwave, który wydaje się świetną alternatywą ... –

8

To trochę późno, ale wyciągnął go poprzez stworzenie tempfile użyciu Ruby 1.9.2 szyny 3,1

file = Tempfile.new(["file_name", '.txt']) 
file.write("my test string".force_encoding('utf-8')) 
p.attachment = file 
+0

genialny .. Nie wiem, dlaczego to działa, ale działa. –

+0

to faktycznie utworzy plik ... https://ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html – olivervbk

40

Aby uniknąć zaśmiecania systemu plików z plików tymczasowych, można użyć StringIO jak w:

p.attachment = StringIO.new(your_string) 
+1

Świetne małe obejście. Gdy to zrobisz, ustaw nazwę pliku załącznika na "p.attachment_file_name =" test.txt "i wszystko gotowe. –

0

podobne do Aarons ale z właściwą metodą bloku jak sugeruje Ruby:

... należy zawsze wywoływać odłączenie lub zamknąć w bloku zapewniającym.

file = Tempfile.new('test.txt') 

begin 
    file.write("Test") 

    p.attachment = file 
    p.save    

    # Whatever else you might need to do with the TempFile. 

ensure 
    file.close 
    file.unlink # Deletes the temp file. 
end 
3

Zarówno spinacza i carierwave skończę tworząc klasę takiego. Posiada obie metody potrzebne do sfałszowania przesyłania plików, które chcą zobaczyć.

class FakeFileIO < StringIO 
    attr_reader :original_filename 
    attr_reader :path 

    def initialize(filename, content) 
    super(content) 
    @original_filename = File.basename(filename) 
    @path = File.path(filename) 
    end 
end 

działa jak marzenie

Powiązane problemy