【问题标题】:Rails paperclip gem - Get file from private folderRails 回形针 gem - 从私人文件夹中获取文件
【发布时间】:2023-03-06 12:40:01
【问题描述】:

我正在使用回形针将文件上传到我的服务器。 如果我不指定路径,回形针将文件保存到公用文件夹,然后我可以通过访问视图中的<%= @user.file.url %> 来下载它。 但是,如果我指定非公共文件夹的路径,显然不可能从视图中获取文件。

我想知道一些从网络和 ruby​​ 脚本下载私人文件夹中保存文件的方法。

【问题讨论】:

  • 您可以从您的 Web 服务器或反向代理服务器进行重定向

标签: ruby-on-rails download paperclip private


【解决方案1】:

我们需要做的第一件事是添加路由到 routes.rb 以访问文件。

编辑 routes.rb 并以粗体添加 :member 参数:

资源 :users, :member => { :avatars => :get }

现在要获取用户 7 的头像,例如,我们可以发出这样的 URL:

 localhost:3000/users/7/avatars

… 并且请求将被路由到users 控制器中的avatars 操作(复数,因为用户可能有多个样式的头像)。

所以现在让我们继续实现 avatars 方法并添加一些代码以将文件下载到客户端。这样做的方法是使用ActionController::Streaming::send_file。这很简单;我们只需要将文件的路径传递给 send_file 以及客户端使用的 MIME 内容类型作为决定如何显示文件的线索,就是这样!让我们对这些值进行硬编码以便更好地理解(在此处为您的机器更新路径):

    class UsersController < ApplicationController
      def avatars
       send_file '/path/to/non-public/system/avatars/7/original/mickey-mouse.jpg',
       :type => 'image/jpeg'
      end
    end

现在,如果您在浏览器中输入localhost:3000/users/7/avatars,您应该会看到米奇图片。

我们显然需要能够处理对任何用户记录的任何头像文件附件的请求,而不是在 avatars 方法中硬编码路径。为此,请配置 Paperclip 并告诉它文件现在存储在文件系统的哪个位置,以及我们配置了要使用的 routes.rb 文件的 URL。

为此,我们需要在我们的用户模型(user.rb)中对 has_attached_file 的调用中添加几个参数,

    has_attached_file :avatar,
    :styles => { :thumb => "75x75>", :small => "150x150>" },
    :path => 
    ':rails_root/non-public/system/:attachment/:id/:style/:basename.:extension',
    :url => '/:class/:id/:attachment' 

但是现在我们可以在 UserController 中泛化我们的代码来处理任何用户,像这样:

    def avatars
      user = User.find(params[:id])
      send_file user.avatar.path, :type => user.avatar_content_type
    end         

现在我们可以再次测试localhost:3000/users/7/avatars 以确保我们没有破坏任何东西。

干杯!

【讨论】:

  • 此代码使用头像的路径发送文件(用于下载或进入其自己的浏览器选项卡/窗口)。但我想知道以下内容是否适用于视图:`。明白我的意思了吗?
猜你喜欢
  • 2011-02-07
  • 2018-07-16
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2017-09-25
  • 2011-12-05
  • 2011-08-17
  • 1970-01-01
相关资源
最近更新 更多