我正在编写Ruby-on-Rails应用程序,它将记录存储在db表中(记录数不超过200行)。每条记录都与jpeg / png图像或图标相关联(最大尺寸为32x32)。因此,我的应用必须上传并将图像保存在特定文件夹中的服务器上。
在文档中它说“params散列中的对象是IO的子类的实例。根据上传文件的大小,它实际上可能是一个StringIO或由临时文件支持的File实例。 ”
我的问题:这个临时文件夹位于服务器上的哪个位置?它是依赖于系统还是依赖于应用程序?
答案 0 :(得分:1)
tempfile的位置可能与系统有关,可能位于/tmp
文件夹中。
但你真的不需要知道。
上传的图像作为StringIO对象存储在内存中,或保存到主机服务器上的临时文件中。这是rails提供的优化。如果图像足够小,Rails会传递一个StringIO对象,它基本上是内存中加载的整个图像。如果图像较大,它将传递一个表示磁盘上临时文件的实例。
您只想将其保存到已知文件夹,例如uploads
。您无需关心图像是存储在内存中还是存储在磁盘上。
StringIO对象和临时文件支持的对象都响应:read
方法。您所要做的就是调用read来获取数据,然后将其写出到您想要的位置。
image_as_io = params[:image]
filename = ... # determine a filename for the image
File.open(Rails.root.join('public', 'uploads', filename), 'wb') do |file|
file.write(image_as_io.read)
end