Warum behandelt OpenURI Dateien mit einer Größe von weniger als 10 KB als StringIO?

Ich rufe Bilder mit open-uri von einer Remote-Website ab und speichere sie auf meinem lokalen Server in meiner Ruby on Rails-Anwendung. Die meisten Bilder wurden ohne Probleme angezeigt, aber einige Bilder wurden einfach nicht angezeigt.

Nach einer sehr langen Debugging-Session habe ich es endlich herausgefunden (danke andieser Blogpost), dass der Grund dafür ist, dass dieclass Buffer in demopen-uri-libary Dateien mit einer Größe von weniger als 10 KB werden als IO-Objekte anstatt als tempfiles behandelt.

Ich habe es geschafft, dieses Problem zu umgehen, indem ich der Antwort von Micah Winkelspecht auf folgtediese StackOverflow-Frage, wobei ich in meinen Initialisierern folgenden Code in eine Datei einfüge:

<code>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
</code>

Das funktioniert bisher wie erwartet, aber ich frage mich immer wieder, warum sie diesen Code überhaupt in die Bibliothek stellen. Kennt jemand einen bestimmten Grund,Warum werden Dateien mit einer Größe von weniger als 10 KB als StringIO behandelt?

Da der obige Code dieses Verhalten für meine gesamte Anwendung praktisch global zurücksetzt, möchte ich nur sicherstellen, dass ich nichts anderes beschädige.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage