我可能迟到了,因为原作者已经继续前进,但是当有人搜索“载波活动资源”时,这个问题出现在顶部,所以我认为它仍然值得回答。
为了便于讨论,我们假设我们有一个名为 Artist 的模型,其中有一张名为artist_picture 的图片作为 CarrierWave 上传器安装。使用 ActiveRecord,您可以将此图片分配给一个文件:
artist.artist_picture=File.open('ravello.jpg')
当您保存艺术家时:
artist.save!
图片也将被保存。
现在,假设我基于此创建一个资源:
class Artist < ActiveResource::Base
end
如果我随后读到一位艺术家:
artist = Artist.find(1)
看看它,我会在那里找到这个:
#<Artist:0x39432039 @attributes={"id"=>1, "name"=>"Ravello", "artist_picture"=>#<ArtistPicture:0x282347249243 @attributes={"url"=>"/uploads/artists/artist_picture/1/ravello.jpg"}, @prefix_options={}, @persisted=false>, @prefix_options={}, @persisted=false>
有趣的是,artist_picture 本身就是一个模型,如果我们愿意,我们可以声明它并使用它。事实上,如果需要,您可以使用 url 来抓取图片。但我们来谈谈上传另一张图片。
我们可以将这一点代码添加到服务器端的 Artist 模型中:
def artist_picture_as_base64=(picsource)
tmpfile = Tempfile.new(['artist','.jpg'], Rails.root.join('tmp'), :encoding => 'BINARY')
begin
tmpfile.write(Base64.decode64(picsource.force_encoding("BINARY")))
file = CarrierWave::SanitizedFile.new(tmpfile)
file.content_type = 'image/jpg'
self.artist_picture = file
ensure
tmpfile.close!
end
end
我只是展示一个简单的示例 - 您可能还应该传递原始文件名。无论如何,在资源方面:
class Artist < ActiveResource::Base
def artist_picture=(filename)
self.artist_picture_as_base64=Base64.encode64(File.read(filename))
end
end
此时,在资源端,您只需将“artist_picture”设置为文件名,并在保存资源时对其进行编码和发送。在服务器端,文件将被解码并保存。想必你可以通过强制字符串进行二进制编码来跳过base64编码,但是当我这样做时它会很糟糕,而且我没有耐心去追踪它。编码为 base64 有效。