2014-12-01 48 views
4

我已经在互联网上尝试了一百万个不同的教程,以了解如何从我的iOS应用程序上传Base64图像到我的Rails应用程序。似乎无论我如何格式化请求,它都不会被接受。如何将Base 64图像上传到Rails回形针

有谁知道如何将Base64图像上传到回形针吗?

我试图发送PARAM作为JSON

{ "thumbnail_image": "base64_data..." } 

我还试图把数据附加URL

{ "thumbnail_image": "data:image/jpeg;base64,alkwdjlaks..." } 

我试图发送JSON对象使用和不使用数据链接

{ "thumbnail_image": { "filename": "thumbnail.jpg", "file_data": "base64_data...", "content_type": "image/jpeg" } } 

我始终得到这些Paperclip::NoHandlerError s,然后它将一大堆数据转移到我的lo G。

回答

1

这是我如何在过去做到了,它基本上是一个强力的办法,不知道是否纸夹在最近版本中添加了更好的支持,但这应该工作

class FooBar < ActiveRecord::Base 
    has_attached_file :thumbnail_image 
    validates_attachment_content_type :thumbnail_image, 
            content_type: %w(image/jpeg image/jpg image/png image/gif), 
            message: "is not gif, png, jpg, or jpeg." 

    attr_accessor :base64_thumbnail_image 

    # call this explicitly from the controller or in an after_save callback 
    # after setting the base64_thumbnail_image attribute 
    def save_base64_thumbnail_image 
    if base64_thumbnail_image.present? 
     file_path = "tmp/foo_bar_thumbnail_image_#{self.id}.png" 
     File.open(file_path, 'wb') { |f| f.write(Base64.decode64(base64_thumbnail_image)) } 
     # set the paperclip attribute and let it do its thing 
     self.thumbnail_image = File.new(file_path, 'r') 
    end 
    end 
end 

# params should be base64_thumbnail_image, not thumbnail_image in this case 
+0

这看起来很有希望。它吸吮回形针基本上忽略了什么已成为最常见的图像提交格式之一:( – OneChillDude 2014-12-01 18:16:34

+0

不幸的是我得到了这个错误。它实际上并没有引发异常,但没有保存图像'内容类型欺骗:文件名thumbnail18。 png([“image/png”]),从文件command:text/plain中发现的内容类型。请参阅文档以允许此组合。' – OneChillDude 2014-12-01 18:24:00

+0

@BrianWheeler - 这是一个单独的问题 - 您需要在模型上添加'validates_attachment_content_type'对于你允许的任何图像类型 - 我将添加到代码示例上面 – house9 2014-12-01 19:13:31

8

你的Base64编码字符串似乎没问题。你总是可以检查,here

所以这个问题可能是在Rails方面。检查您收到的字符串是否与发送的字符串完全相同。

用回形针4.2.1我设法挽救Base64的GIF文件的方式:

有:

class Thing 
    has_attached_file :image 

和POST属性:

{ 
    "thumbnail_data:" "data:image/gif;base64,iVBORw0KGgo..." 
} 

所有你需要做的是找到适当的适配器并指定original_filename。所以对于控制器来说,这将是:

def create 
    image = Paperclip.io_adapters.for(params[:thumbnail_data]) 
    image.original_filename = "something.gif" 
    Thing.create!(image: image) 
    ... 
end 

AFAIK回形针使得从版本3.5.0更容易保存base64。

希望有帮助!

+0

正则表达式。事实上,至少在Paperclip 3.5.4中起作用。不过,它在第3.4.2节中不起作用。 – JellicleCat 2015-06-24 16:03:36

相关问题