我已经为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)访问它。不确定是否有效果......
答案 0 :(得分:3)
如果您正在使用Apache和Passenger(可能还有其他服务器)并拥有以下行:
config.action_dispatch.x_sendfile_header = "X-Sendfile"
在你的production.rb env文件中,你有两个选择:
答案 1 :(得分:2)
每次将应用部署到生产环境时,您是否都在继续上传目录?假设您使用capistrano(或类似)进行部署,每次部署时,您可能会在新部署的版本目录中创建新的uploads目录。在这种情况下,以前上传的文件驻留在较旧的已部署版本中(如果您没有删除这些文件),并且您的应用程序将无法再访问这些文件。
您要创建例如在每次部署时符号链接到您的应用程序的shared/uploads
目录。