ruby-on-rails – 性能问题通过Paperclip上传大文本文件

我正在从
Ruby 1.8.7升级到1.9.3并从Rails 2.3升级到3.2作为升级的一部分,我将从Paperclip 2.2.9升级到3.5.2.我的ImageMagick版本是6.8.6.我在升级过程中发现的一个问题是,对于大型(~1 MB)文本文件,上传性能非常差.有问题的文件不需要特别是.txt文件,任何明文格式的文件(例如.xml文件)也会受到影响.

供您参考,这是我的Paperclip设置:

  has_attached_file :attachment,
    :url => "/shared_documents/:id/:basename.:extension",
    :path => ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

为简单起见,我省略了我们的验证等等,因为我们只是检查文件大小和存在.

看着我的开发机器上运行的顶级进程,当Paperclip调用ImageMagick的identify命令时,似乎出现了瓶颈.通过命令行调用各种文件的标识使我能够验证图像文件几乎立即返回元数据,但是大型非图像文本文件需要很长时间才能处理.

对于我的应用程序,我允许用户以他们喜欢的任何格式上传文档,因此我必须能够有效地处理图像和文本文件.还有其他人遇到过这个问题吗?有没有办法选择性地禁止在Paperclip中的某些文件格式上调用识别而不是其他文件格式?如果做不到这一点,我们可以忍住,如果这是一个选项,就不会打电话给身份识也许有一种方法可以将ImageMagick配置为更优雅地处理大型文本文件?

最佳答案 如果您实际上没有对文件进行处理,请告诉Paperclip不要对它们进行处理.从Paperclip文档中,您可以通过几种方式完成此操作.一种是在模型中提供一个空的样式列表:

has_attached_file :attachment, 
  styles:{}, 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

或者,您可能只提供没有处理器

has_attached_file :attachment, 
  processors:[], 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

或者,您可以在模型中使用before_post_process回调并返回false以暂停该过程,但Paperclip可能首先调用ident来验证该文件,这将使该选项对您的情况毫无意义:

has_attached_file :attachment, 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

before_post_process :skip_processing

def skip_processing
  false
end
点赞