0

assets/books_icon我有一个 Rails 应用程序,它将在用户创建书籍时上传名称与书籍 ID 相同的图像。

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服务器上部署了带有乘客的rails应用程序,并config.assets.compile = true在开发配置文件中进行了更改。

在生产模式下,我可以创建新书并将图像上传到assets/books_icon. 但是,我刚刚上传的图像的文件路径不会update

比如我新建了一本id为2的书,里面有2.jpg assets/books_icon。但是rails应用程序会告诉我http://localhost/assets/images/books_icon/2.jpg丢失了。

但是,当我重新启动 apache 服务器时,我可以在以下位置查看图片http://localhost/assets/images/books_icon/2.jpg

有什么办法可以解决这类caching问题吗??

4

1 回答 1

2

在这种情况下,上传的图像并不真正被视为“资产”——将其视为您碰巧存储在其他地方的数据。(图像资产可能是徽标或背景图像等)。Rails 的资产管道做了一些非常棘手的事情,以便在实际资源(例如图像)是资产时解析简单的文件路径。

默认情况下,Rails 将该app/public文件夹设置为文档根目录,因此您可以将图像上传到一个位置——也许在一个名为“upload/img”的子目录中,在这种情况下,您可以使用 path 引用它/upload/img/mybook.jpg

然而,这种方法往往很脆弱,因为图像实际上直接与数据库中的数据相关联,但位于服务器的文件系统上。当您从开发转移到登台或生产服务器时,它开始分崩离析。

推荐的一种方法是上传图像并将其作为 blob 类型存储在数据库中。我建议的另一个方法是拥有另一个“中央”服务器,您可以将图像上传到它作为数据库的扩展。许多人使用亚马逊AWS“S3”服务来处理这种事情。看看CarrierWave gem,它在使所有这些变得非常简单、灵活和强大方面做得非常出色。

于 2012-11-29T14:10:04.940 回答