我从远程网站获取带有 open-uri 的图像,并将它们保存在我的 Ruby on Rails 应用程序中的本地服务器上。大多数图像显示没有问题,但有些图像没有显示。
经过很长的调试会话后,我终于发现(感谢这篇博文),原因是class Buffer
open -uri-libary中的将大小小于 10kb 的文件视为 IO 对象而不是临时文件。
我按照 Micah Winkelspecht 对这个 StackOverflow question的回答设法解决了这个问题,我将以下代码放在我的初始化程序的文件中:
require 'open-uri'
# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0
到目前为止,这按预期工作,但我一直想知道,为什么他们首先将这段代码放入库中?有人知道具体原因,为什么 10kb 以下的文件会被视为 StringIO ?
由于上面的代码实际上为我的整个应用程序全局重置了这种行为,我只想确保我没有破坏其他任何东西。