ruby – 为什么OpenURI将大小为10kb的文件视为StringIO?

我从远程网站获取带有open-uri的图像,并将其保存在我的Ruby on Rails应用程序的本地服务器上。大多数图像显示没有问题,但一些图像没有出现。

经过很长的调试会话后,我终于发现(感谢this blogpost),原因是open-uri-libary中的Buffer Buffer将大小为10kb的文件视为IO对象而不是临时文件。

我设法通过将Micah Winkelspecht的答案追溯到this 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?

由于上述代码对我的整个应用程序实际上全局重置了这种行为,所以我只想确保我没有打破任何其他应用程序。

当进行网络编程时,您将分配一个相当大的缓冲区,并发送和读取适合缓冲区的数据单元。但是,当处理文件(或有时称为BLOB)时,您不能假定数据将适合您的缓冲区。因此,您需要对这些大量数据进行特殊处理。

(有时,适合缓冲区的数据单元称为数据包,但数据包真的是第4层,像帧位于第2层。由于这是第7层,所以它们可能被称为消息。)

对于大于10K的回复,open-uri库正在设置写入流对象的额外开销。当在StringMax大小下,它只包含消息中的字符串,因为它知道它可以适合缓冲区。

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/10496874/why-does-openuri-treat-files-under-10kb-in-size-as-stringio

转载注明原文:ruby – 为什么OpenURI将大小为10kb的文件视为StringIO?