Tag: 标准库

为什么OpenURI将10kb以下的文件视为StringIO?

我从远程网站用open-uri获取图像,并在Ruby on Rails应用程序中将它们保存在我的本地服务器上。 大多数图像显示没有问题,但有些图像没有出现。 经过一段很长的调试会话后,我终于发现了(感谢这篇博文 ),其原因是open-uri-libary中的class Buffer将大小小于10kb的文件视为IO对象而不是临时文件。 我设法通过Micah Winkelspecht对这个StackOverflow问题的回答解决了这个问题 ,我把以下代码放在我的初始化器中的一个文件中: 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? 由于上面的代码实际上为我的整个应用程序全局重置了这种行为,我只想确保我没有破坏其他任何东西。