我有一个rails应用程序,当用户创建一本书时,它会将名称与书籍ID相同的图像上传到assets/books_icon
。
upload_icon(params[:book][:image_upload])
# upload_image when create/update book
def upload_icon(uploaded_io)
photo_directory = "app/assets/images/"
# only when user upload the iphoto
if uploaded_io.present?
# upload to the exact location with category_id
extension = File.extname(uploaded_io.original_filename)
photo_location = 'books_image/'+ @book.id.to_s + extension
# open in binary mode
photo_full_location = photo_directory + photo_location
File.open(photo_full_location, 'wb') do |file|
file.write(uploaded_io.read)
end
# only have to state which is the directory,
# image_tag will use assets piepline which will add 'assets/images/' as prefix in src
@book.update_attribute(:image_url, photo_location)
end
end
它在开发模式下工作。然后,我使用mysql作为数据库在mac Apache2服务器上部署了带有passenger的rails应用程序,并在开发配置文件中更改了config.assets.compile = true
。
在制作模式中,我可以制作新书,然后将图片上传到assets/books_icon
。但是,我刚上传的图片的文件路径不会是update
。
例如,我创建了一个id为2的新书,assets/books_icon
中有2.jpg。但rails应用程序会告诉我http://localhost/assets/images/books_icon/2.jpg
丢失了。
但是,当我重新启动apache服务器时,我可以在http://localhost/assets/images/books_icon/2.jpg
是否有任何解决方案可以解决此类caching
问题?
答案 0 :(得分:2)
在这种情况下,上传的图像并不真正被视为“资产” - 将其视为您恰好存储在其他地方的数据。 (图像资产可能是徽标或背景图像等)。 Rails的资产管道做了一些非常棘手的工作,以便在资产成为资产时解析到实际资源(例如图像)的简单文件路径。
默认情况下,Rails使app/public
文件夹成为文档根目录,因此可以将图像上传到 - 也许在名为“upload / img”的子目录中,在这种情况下,您可以使用路径/upload/img/mybook.jpg
。
这种方法往往很脆弱,但是因为图像实际上与数据库中的数据直接相关,但位于服务器的文件系统上。当您从开发阶段转向停滞或生产服务器时,它开始崩溃。
我不建议的一种方法是上传图像并将其作为blob类型存储在数据库中。另一个我 建议的是另一个“中央”服务器,您可以上传图像作为数据库的扩展。许多人使用Amazon AWS“S3”服务来做这种事情。看一下CarrierWave gem,它可以让所有这些变得非常简单,灵活和强大。