2012-03-30 10 views
4

Rubyでは、open-uriでリモートファイルを開くと、ファイルオブジェクトのパスは、/tmp/20120329-2113-1-0762/open-uri20120329-1-7dit2cのようになります。私は存在するファイルの拡張子に依存するいくつかのファイル処理を持っています。 open-uriを使用している場合、拡張子を保持するか強制する方法はありますか?open-uriで拡張機能を維持することはできますか?

ここでは、open-uriを使用してリモートファイルを開いてそのパスを取得するときの動作を示す短い対話を示します。それはそのオブジェクトの生成された一時的なユニークなファイルだが、問題は拡張性の欠如であるので、パスはリモートURLへの完全に異なるになります。

> require "open-uri" 
=> true 

> f = open("http://cdn.sstatic.net/stackoverflow/img/sprites.png") 
=> #<File:/var/folders/zq/vx2std7x5qj54xc1g4hpm14h0000gn/T/open-uri20120401-38087-13mm6zy> 

> f.path 
=> "/var/folders/zq/vx2std7x5qj54xc1g4hpm14h0000gn/T/open-uri20120401-38087-13mm6zy" 
+0

コードを表示する必要があります。 Open-URIはパイプであり、ファイルを保存する責任はありません。あなたのコードはです。 –

+0

@ theTinMan open-uriがファイルをダウンロードして保存した後、使用するためにファイルを開きます。そのファイルの拡張子が間違っています。私はそれを示すためにいくつかのコードを投稿します。 – Pablo

+0

これは一時的なバッファとして保存していますが、最終的なファイルとして使用することはできません。 'open'から戻ってきたファイルハンドルを' read'して、あなたが望む場所に保存します。 –

答えて

-1

理由だけを/ tmpに右拡張子で保存しませんそこからそれを開きますか?余計なステップですが、ボトルネックになったときに効率的なソリューションを探すことができます。

+0

それは私がやっていることですが、それはopen-uriがファイルをダウンロードして開き、すべての内容を読み、それを使って操作を行うために開いた別のファイルを書き込むことを意味します。私はそれが気に入らない、エレガントではない、それはリソースの無駄であり、ソースコードは本当に混乱している。 – Pablo

+1

私はそれがエレガントではないことに同意しますが、そうである必要はありません。実用的でなければならない。 download_by_keeping_extension_and_reopenというメソッドにハックを抽出すれば、コードはあまり混乱しないように見えます。リソースが心配な方は、open-uriの機能を再実装することができます。Curbまたはhttp libでダウンロードし、ファイルに保存してファイルを開きます。 – Leventix

+0

+1 @レヴェントゥクス:「エレガント」は、あなたがカバーの下にいるときは決してエレガントではありません。それは、私たちが物事が優雅であると信じることを可能にするより高いレベルの統語的な砂糖です。 Curb、TyphoeusなどのHTTPライブラリは、マルチGBファイルが受信されている場合にメモリを充填することに懸念があるため、メモリだけにストリームするのではなく、ディスクにもバッファリングします。 Net :: HTTPを使用すると、コードを書くことでメモリにストリーミングすることは可能ですが、スケーラビリティはほとんどありません。 –

関連する問題