我正在从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
命令时,似乎出现了瓶颈。通过命令行对各种文件调用identify
使我能够验证图像文件几乎立即返回元数据,但是大型非图像文本文件需要很长时间才能处理。
对于我的应用程序,我允许用户以他们喜欢的任何格式上传文档,因此我必须能够有效地处理图像和文本文件。还有其他人遇到过这个问题吗?有没有办法选择性地禁止在Paperclip中的某些文件格式上调用identify
而不是其他文件格式?如果失败了,如果这是一个选项,我们可以直接不调用identify
。也许有一种方法可以将ImageMagick配置为更优雅地处理大文本文件吗?
答案 0 :(得分:2)
如果您实际上没有对文件进行处理,请告诉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可能首先调用identify
来验证该文件,这会使此选项对您的情况毫无意义:
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