2014-05-15 14 views
10

Tôi có một kiểu ảnh có thuộc tính hình ảnh. Hình ảnh chứa chuỗi base64 thu được từ api. Tôi cần chạy một callback after_create và tôi đã nghĩ rằng mình có thể sử dụng Paperclip để lưu hình ảnh vào đĩa trong callback vì nó sẽ tiết kiệm cho tôi một số công việc thực hiện cấu trúc thư mục trong thư mục chung và tạo thumbnail. Có cách nào dễ dàng để làm điều đó không?Sử dụng kẹp giấy để lưu hình ảnh base64 thu được từ một api

Trả lời

16

Để trả lời câu hỏi của riêng tôi, đây là những gì tôi đã đi lên với:

class Photo < ActiveRecord::Base 

    before_validation :set_image 

    has_attached_file :image, styles: { thumb: "x100>" } 
    validates_attachment :image, presence: true, content_type: { content_type: ["image/jpeg", "image/jpg"] }, size: { in: 0..10.megabytes } 

    def set_image 
    StringIO.open(Base64.decode64(image_json)) do |data| 
     data.class.class_eval { attr_accessor :original_filename, :content_type } 
     data.original_filename = "file.jpg" 
     data.content_type = "image/jpeg" 
     self.image = data 
    end 
    end 

end 

image_json là một lĩnh vực văn bản có chứa các hình ảnh thực tế base64 mã hóa (chỉ là một phần dữ liệu, ví dụ: "/ 9j/4AAQSkZJRg ... ")

+0

hi, từ quan điểm u đã vượt qua chuỗi được mã hóa như là một lĩnh vực ẩn để điều khiển? và từ bộ điều khiển những gì bạn đã làm gì? –

+0

không có gì đặc biệt, chỉ cần một cái gì đó như Photo.create! (Image_json: i) nơi tôi là dữ liệu từ các băm params có chứa chuỗi base64 – maprihoda

+0

Điều này là rất tốt, cảm ơn! – ipd

5

set_image của bạn sẽ giống như thế này

0
require 'RMagick' 
data = params[:image_text]# code like this data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q 
image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1]) 
new_file=File.new("somefilename.png", 'wb') 
new_file.write(image_data) 

Sau khi bạn kan sử dụng i pháp sư như tập tin Photo.new (ảnh: hình ảnh) #save useng kẹp giấy trong mô hình Ảnh

1

Ít nhất với Kẹp giấy 5 nó hoạt động ra khỏi hộp bạn cần cung cấp chuỗi base64 với định dạng data:image/jpeg;base64,#{base64_encoded_file}

Đối với bạn mô hình nó sẽ được

Photo.new(
    image: "data:image/jpeg;base64,#{image_json}", 
    image_file_name: 'file.jpg' # this way you can provide file_name 
) 

Ngoài ra trong bộ điều khiển của bạn, bạn không cần phải thay đổi bất cứ điều gì :-) (có thể bạn muốn chấp nhận :image_file_name trong params)

+0

Loại nội dung có chấm bên trong được cố định khoảng 4.2, các phiên bản cũ hơn cũng hỗ trợ bộ điều hợp base64, nhưng chỉ cho các loại nội dung dễ dàng (sửa là thay thế regex) – Vasfed

0

Theo Paperclip 5.2, bạn cần phải đăng ký DataUriAdapter cho Paperclip để xử lý hình ảnh base64 cho bạn.

Trong config/initializers/kẹp giấy đặt: Paperclip::DataUriAdapter.register

Rồi như @eldi nói rằng bạn chỉ có thể làm:

Photo.new(
    image: "data:image/jpeg;base64,#{image_json}", 
    image_file_name: 'file.jpg' # this way you can provide file_name 
) 

(Xem Kẹp giấy ghi chú phát hành here)

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