在Rails中提供受保护/个人下载的工作概念是什么?

时间:2009-06-22 07:29:27

标签: ruby-on-rails

我想知道如何让登录用户在服务器上下载他的文件和他的文件。例如,没有其他人,只有我可以在登录时下载我的Google文档文档。是否有一个概念页面,您可以轻松链接到我可以阅读的内容?有没有像食谱一样的书可能会更详细,更具体地说明Rails中的实现?是否有宝石/插件已经这样做了?

由于

2 个答案:

答案 0 :(得分:1)

我建议创建一个限制访问下载的控制器。诀窍是通过控制器提供文件,而不是直接从Apache提供。我假设你在这里使用RestfulAuthentication和Paperclip:

这是模型(带有图像附件的照片)

class Photo < ActiveRecord::Base
  belongs_to :user

  has_attached_file :image, #:styles => {:thumbnail => "100x100#", :large => "800x600>"},
   :path => ":rails_root/assets/:attachment/:id_partition/:style/:basename.:extension",
   :url => "/assets/:userid/:attachment/:id/:style"
end

请注意url属性,该属性与下面的路由一起将强制通过控制器访问图像,而不是直接从公共目录访问。另请注意:path属性指定私有资产目录而不是默认的公共目录。

map.assets 'assets/:userid/:attachment/:id/:style', :controller => 'assets', :action => 'get', :conditions => {:method => :get }

现在,这是一个简单的控制器,它要求用户登录,检查用户ID并将相应的文件发送回用户。

class AssetsController < ApplicationController
  before_filter :login_required

  def get
    if current_user.id == params[:userid].to_i
      @photo = Photo.find params[:id]
      send_file @photo.image.path(params[:style]), :type => @photo.image_content_type, :disposition => 'inline'
    else
      render :nothing => true
    end
  end
end

您还应该在send_file中指定:x_sendfile => true,以便在控制器批准后让Apache承担实际服务文件的压力,从而提高性能。

答案 1 :(得分:0)

“让登录的用户在服务器上下载他的文件”

您是否有办法独特地了解谁拥有哪个文件?这是起点,如果说文件是图像而你只想让我看到我的图像,那么在保存(上传)图像时,请确保将图像数据与我的用户ID一起存储。

因此,一旦登录,您只需选择属于我的内容。请看下面的表格(图片示例,假设它们存储在FileSystem中)

照片(id,title,desc,file_name,user_id *)*用户ID是登录用户的ID

这些插件可以提供帮助

  • RestFul身份验证
  • ActiveACL(或任何其他授权插件)
  • PaperClip(文件上传)