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

Ruby on rails 在Rails中提供受保护/个人下载的工作概念是什么?,ruby-on-rails,Ruby On Rails,我想知道如何让一个登录的用户在服务器上下载他的文件。例如,只有我才能在登录后下载我的谷歌文档。有没有一个概念页面可以链接到handy,我可以在上面阅读?有没有像菜谱书这样的书可以更详细、更具体地介绍Rails中的实现?是否有一个gem/插件已经做到了这一点 谢谢让登录用户在服务器上下载他的文件,并且只下载他的文件 你有没有办法知道谁拥有什么文件?这是一个起点,如果说文件是图像,而您只想让我看到我的图像,那么在保存上载图像时,请确保将图像数据与我的用户id一起存储 所以一旦我登录,你只选择属于我的

我想知道如何让一个登录的用户在服务器上下载他的文件。例如,只有我才能在登录后下载我的谷歌文档。有没有一个概念页面可以链接到handy,我可以在上面阅读?有没有像菜谱书这样的书可以更详细、更具体地介绍Rails中的实现?是否有一个gem/插件已经做到了这一点


谢谢

让登录用户在服务器上下载他的文件,并且只下载他的文件

你有没有办法知道谁拥有什么文件?这是一个起点,如果说文件是图像,而您只想让我看到我的图像,那么在保存上载图像时,请确保将图像数据与我的用户id一起存储

所以一旦我登录,你只选择属于我的东西。请看下表中的图像示例,假设它们存储在文件系统中

photosid、标题、描述、文件名、用户id**用户id是登录者的id

这些插件可以提供帮助

RestFul身份验证 ActiveACL或任何其他授权插件 回形针文件上传
我建议创建一个控制器来限制对下载的访问。诀窍是通过控制器提供文件,而不是直接从Apache提供。我假设您在这里使用的是RestfulAuthentication和回形针:

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

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
现在,这是一个简单的控制器,它要求用户登录,检查用户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_文件中指定:x_sendfile=>true,以便在控制器批准文件后让Apache承担实际服务该文件的压力,从而提高性能

感谢恩格莎;一个唯一的ID可以找到一个唯一的用户,我猜我的问题或恐惧的本质是什么!我很害怕有人会猜到某个文件的URL。这在Rails中可能吗?或者是因为每个URL都是一个URL,所以这不是不可能的吗?这太棒了!感谢您的深入指导。我的头脑当然更为平静,因为我知道,下载内容的人是有限制的。现在这个回形针业务,简单地说,一旦安装,就会截取“所有”URL,这就是故事吗如果我没记错的话,虽然我不记得在哪里,我读过一篇文章或者一本电子书,其中提到Rails的应用程序的控制器+操作是你唯一可能的URL,对吗?再次谢谢你!六羟甲基三聚氰胺六甲醚。。。不太清楚你的意思。我建议您从一个简单的rails应用程序开始,慢慢地构建它。RestfulAuthentication就是让用户注册、登录、注销,并确保某些页面只对登录的用户可见。它提供了登录所需的筛选器和您在上面看到的当前用户变量。回形针是一个用于管理文件上传的插件。从本质上讲,它承担着存储文件和管理有关文件的元数据(即数据库中的路径、大小和类型)的任务。解决方案的主要关键是资产控制器
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