2010-11-03 23 views
13

Tôi có một tệp rake, đọc nội dung qua HTTP và tôi muốn sử dụng Paperclip để lưu trữ nội dung đã tải trên Amazon S3. Nó hoạt động tốt khi tôi cung cấp một tệp cục bộ, nhưng tôi muốn đặt nội dung dưới dạng chuỗi và đặt loại nội dung theo cách thủ công.Cách sử dụng Kẹp giấy không có tệp, chỉ với một chuỗi?

Các mục sau không hoạt động. Không có lỗi được ban hành, mục cơ sở dữ liệu được cập nhật, nhưng không có tập tin được tạo ra trong 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 

Tôi đoán tôi có thể viết một tập tin tạm thời với nội dung của tôi, nhưng điều đó sẽ là một giải pháp khá hiệu quả.

Trả lời

2

Không, bạn phải tạo tệp bằng chuỗi của mình.

Chỉ cần nhìn vào mã nguồn Kẹp giấy: https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L77https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/iostream.rb#L5

khi bạn gán một cái gì đó sử dụng my_model.attachment =, Kẹp giấy muốn một đối tượng tập tin.

+0

Đó là bất hạnh. Bạn có nghĩ rằng tôi nên sử dụng một cái gì đó khác hơn là Paperclip sau đó? Tôi muốn giữ cơ hội chuyển từ S3 sang hệ thống tệp dễ dàng, nhưng tôi không có tệp tải lên của người dùng, vì vậy Paperclip có thể là lựa chọn sai. – Jan

+1

có bạn nhìn vào carrierwave: https://github.com/jnicklas/carrierwave mà có vẻ là một thay thế tuyệt vời ... –

8

Đó là hơi muộn nhưng tôi kéo nó đi bằng cách tạo ra một Tempfile sử dụng ruby ​​1.9.2 ray 3,1

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

rực rỡ .. Tôi không biết tại sao nó hoạt động, nhưng nó hoạt động. –

+0

điều này thực sự sẽ tạo một tệp ... https://ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html – olivervbk

40

Để tránh xả rác hệ thống tập tin với các tập tin tạm thời, bạn có thể sử dụng StringIO như trong:

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

Cách giải quyết ít tốn kém. Khi bạn thực hiện việc này, hãy đặt tên tệp đính kèm của bạn bằng 'p.attachment_file_name = 'test.txt'' và bạn đã sẵn sàng. –

0

Tương tự như Aarons nhưng với phương pháp khối thích hợp theo đề nghị của Ruby:

... người ta luôn luôn nên bỏ liên kết hoặc đóng trong một khối đảm bảo.

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

Đối với cả hai chiếc kẹp giấy và carierwave Tôi kết thúc việc tạo một lớp như thế này. Nó có cả hai phương pháp cần thiết để giả lập một tập tin tải lên mà họ muốn xem.

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 

trình như một giấc mơ

Các vấn đề liên quan