Rails 3 app + paperclip gem + production mode =下载空文件

时间:2011-06-07 21:54:26

标签: ruby-on-rails paperclip production-environment

我已经为Rails 3应用程序安装了paperclip gem。在开发模式下一切正常。但是,在生产模式下运行时,如果我上传文件然后再次尝试下载,它会下载一个具有正确名称和扩展名的文件,但它是一个空文件。在服务器上查看时,文件会上传并位于正确的目录中。 (我的应用程序根目录中有一个“uploads”文件夹。)

有人发生过这种情况吗?

我的模特:

# app/models/document.rb
class Document < ActiveRecord::Base  
  belongs_to :kase  

  has_attached_file :document, :path => (Rails.root + "uploads/:class/:kase_id/:id").to_s, :url => ":class/:id"

  validates_attachment_presence :document
  validates_attachment_content_type :document, :content_type => [
    'application/pdf',
    'image/png',
    'image/jpeg',
    'image/pjpeg',
    'text/plain'
  ]
end

我的控制器:

# app/controllers/documents_controller.rb
class DocumentsController < ApplicationController
  respond_to :html

  before_filter :initialize_kase # Sets the @kase instance

  def show
    @document = @kase.documents.find(params[:id])
    send_file @document.document.path, :filename => @document.document_file_name, :content_type => @document.document_content_type
  end    
end

我的初始化程序(在上面的has_attached_file中设置:kase_id占位符:

# config/initializers/paperclip.rb
Paperclip.interpolates('kase_id') do |attachment, style|
  "kases/#{attachment.instance.kase.id.to_s}"
end

我也应该提一下,我作为嵌套控制器(/ kases / XX / documents / XX)访问它。不确定是否有效果......

2 个答案:

答案 0 :(得分:3)

如果您正在使用Apache和Passenger(可能还有其他服务器)并拥有以下行:

config.action_dispatch.x_sendfile_header = "X-Sendfile"

在你的production.rb env文件中,你有两个选择:

  1. 安装apache模块mod-xsendfile
  2. 注释掉该行并让Rails发送文件而不是Apache,就像在开发模式下一样。

答案 1 :(得分:2)

每次将应用部署到生产环境时,您是否都在继续上传目录?假设您使用capistrano(或类似)进行部署,每次部署时,您可能会在新部署的版本目录中创建新的uploads目录。在这种情况下,以前上传的文件驻留在较旧的已部署版本中(如果您没有删除这些文件),并且您的应用程序将无法再访问这些文件。

您要创建例如在每次部署时符号链接到您的应用程序的shared/uploads目录。