【问题标题】:Rails4: How do I store images uploaded by carrierwave in private folder?Rails4:如何将carrierwave上传的图像存储在私人文件夹中?
【发布时间】:2014-09-30 13:36:48
【问题描述】:

我已在公共文件夹下使用carrierwave 上传图像。 出于安全考虑,我将把文件夹改到根目录下。

虽然我参考了How to: Secure Upload的帖子并创建了carrierwave.rb,但我不知道如何编写carrierwave上传的路径。

如何在私人文件夹下显示图片?

image_uploader.rb

class ImageUploaader < CarrierWave::Uploader::Base

  storage :file
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

end

我创建了 \config\initializers\carrierwave.rb

CarrierWave.configure do |config|
  config.permissions = 0600
  config.directory_permissions = 0700
  config.root = Rails.root
end

我还创建了 images_controller.rb

class ImagesController < ApplicationController
    #I tried some, but doesn't work
end

我使用以下视图来显示图像。
\views\articles\ _article.html.erb

<% article.photos.each do |photo| %>
  <%= image_tag(photo.image_url(:thumb).to_s, class: :thumb) if photo.image? %>
<% end %>

如果您能在routes.rbimages_controller.rb_article.html.erb 中指定代码,我们将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 carrierwave


    【解决方案1】:

    我正在使用Rails 4 In Action,我们也有类似的需求。在那本书中,他们让我们在应用根目录下创建一个名为“files”的文件夹。

    然后我们将您上传器中的行从:

    uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}
    

    files/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}
    

    现在,在那本书中,文件被放到files 目录中。然后,您可以使用 CanCanCan 之类的东西设置权限,或者自己编写。好像就是这样。我想。

    【讨论】:

    • 谢谢你的回答,@Art。我可以将图像存储在文件夹中。我想知道如何在文件夹中显示图像。如果您能更具体地显示图像,我们将不胜感激。
    【解决方案2】:

    这是一个老问题,也许它会帮助别人,就像它帮助了我一样。 我认为您误解了参考资料中的解释: 添加这条路线:

    match "/uploads/photos/:id/:basename.:extension", controller: "photo", action: "send_img", via: :get
    

    所以每个 URL 请求如:/uploads/photos/1/best_ever_img.png 将被“重定向”到 photos 控制器中的 send_img 操作

    关于你的行动,

    类照片 mount_uploader :图片、图片上传

    def send_img
        id = params[:id]
        basename = params[:basename]
        extension = params[:extension]
        type = params[:type]
        # if you have a different environment in your dev and production, you can add each unique route
        if Rails.env.development?
            # The route to your project folder
            # My dev server is on windows Linux shell so the route is like this, you may use other development environment so just update the route
            base_url = "/mnt/c/Users/YOUR_USER_NAME/Desktop/Sites/"
        else
            base_url = "/home/deploy"
        end
        # Replace the `YOUR_PROJECT_FOLDER` with name of yours
        path = "#{base_url}/YOUR_PROJECT_FOLDER/uploads/photos/image/#{id}/#{basename}.#{extension}"
        send_file path, x_sendfile: true
    end
    

    在您的视图中,像这样加载图像:

    <%= image_tag "uploads/photos/#{photo.id}/#{File.basename(photo.image.url)}" %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2014-03-09
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      相关资源
      最近更新 更多