1

目前我正在编写一个 Sinatra 应用程序,它从用户那里获取一些图片并返回一张新图片。

有一部分haml形式:

  %input{type:'file', name:'user_image'}

还有来自处理程序的代码:(蒙太奇是另一张图片)

  source_userpic = params[:user_image][:tempfile]
  blob = File.open(source_userpic).read
  userpic = ImageList.new
  userpic.from_blob(blob)
  resized_img = userpic.scale(montage.columns,
                              montage.rows)
  resized_img.opacity = MaxRGB/3

然后将两个图像“分层”合成并存储(不需要)

  final_picture = ImageList.new
  final_picture << montage.composite(resized_img, 0, 0, OverCompositeOp)


  final_picture.write("./public/uploads/#{DateTime.now}.jpg" # dirty (for example)

接下来,我需要用ajax 显示一个final_picture。有两个明显的问题:首先,我不需要保存 final_picture - 它只是预览,其次,我必须编写代码以避免文件名冲突......

如何发送 final_picture 来查看?to_blob 方法?但接下来是什么?

4

2 回答 2

5

我通过使用数据 URI 方案解决了这个问题。

require 'base64'

final_picture.format = "jpeg" # whatever
# Using a to_blob method to create a direct-to-memory version of the image.
# Then encode it to base64 string
data_uri = Base64.encode64(final_picture.to_blob).gsub(/\n/, "") 
@image_tag = '<img alt="preview" src="data:image/jpeg;base64,%s">' % data_uri

haml:'pages/preview'

然后显示一张图片

= @image_tag

不确定这是否是最佳解决方案

于 2013-02-18T11:33:51.090 回答
1

看看Tempfile,它应该为你处理文件名冲突。

然后你可以使用这个问题的答案中的技术,使用send_file发送临时文件。

您必须记住临时文件不会持久化,因此如果您使用不同的请求和响应来提供文件,则必须小心管理该持久性。

于 2013-02-18T00:40:06.117 回答