Rails paperclip gem - 从私人文件夹中获取文件

use*_*607 3 private ruby-on-rails download paperclip

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

我想知道从web和ruby脚本下载保存文件的方法.

My *_*God 5

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

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

resources:users,:member => {:avatars =>:get}

现在,为了获得用户7的头像,我们可以发出如下URL:

 localhost:3000/users/7/avatars
Run Code Online (Sandbox Code Playgroud)

...并且请求将被路由到控制器中的avatars动作users(复数,因为用户可能具有多种风格的化身).

现在让我们继续前进并实现avatar方法并添加一些代码以将文件下载到客户端.这样做的方法是使用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
Run Code Online (Sandbox Code Playgroud)

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

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

为此,我们需要在我们的User模型(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' 
Run Code Online (Sandbox Code Playgroud)

但现在我们可以在UserController中推广我们的代码来处理任何用户,如下所示:

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

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

干杯!