在rails生产环境中上传文件后,文件路径不会更新

时间:2012-11-29 13:58:36

标签: ruby-on-rails ruby file-upload passenger

我有一个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问题?

1 个答案:

答案 0 :(得分:2)

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

默认情况下,Rails使app/public文件夹成为文档根目录,因此可以将图像上传到 - 也许在名为“upload / img”的子目录中,在这种情况下,您可以使用路径/upload/img/mybook.jpg

这种方法往往很脆弱,但是因为图像实际上与数据库中的数据直接相关,但位于服务器的文件系统上。当您从开发阶段转向停滞或生产服务器时,它开始崩溃。

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