【问题标题】:Is it possible to have open-uri maintain the extension?是否可以让 open-uri 维护扩展?
【发布时间】:2012-03-30 09:48:07
【问题描述】:

在 Ruby 中,当您使用 open-uri 打开远程文件时,文件对象最终会具有类似以下内容的路径:/tmp/20120329-2113-1-0762/open-uri20120329-1-7dit2c。我有一些文件处理取决于存在的文件的扩展名。使用 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"

【问题讨论】:

  • 你需要展示一些代码。 Open-URI 是管道,不负责保存文件,您的代码是。
  • @theTinMan open-uri 下载并保存文件,然后打开它供您使用。该文件的扩展名错误。我会发布一些代码来证明这一点。
  • 它把它保存为一个临时缓冲区,它不是供你用作最终文件的。 read 你从open 得到的文件句柄并将它保存在你想要的地方。
  • @theTinMan 我没有尝试以任何其他方式使用该文件,而是尝试读取它,但我希望临时缓冲区返回具有正确扩展名的路径。然后我就可以使用它,而不必写下来,打开它,使用它,关闭它,删除它。
  • 可能是这样,但是您的使用会破坏临时文件的用途。它不是供你使用的,它是供 Open::URI 使用的。很多东西在现代操作系统上创建临时文件,但它们被理解为仅用于创建它的例程。不支持尝试使用临时文件,您自行承担风险,因为位置和/或文件格式可能会在没有警告的情况下更改。

标签: ruby open-uri


【解决方案1】:

为什么不把它用正确的扩展名保存到/tmp,然后从那里打开呢?这是一个额外的步骤,但当它成为瓶颈时,您可以寻找更有效的解决方案。

【讨论】:

  • 这就是我正在做的事情,但这意味着 open-uri 下载文件,打开它,我读取它的所有内容,然后将它写入其他一些文件,然后我打开它来执行操作它。我不喜欢它,它不优雅,它浪费资源而且源代码真的很混乱。
  • 我同意它并不优雅,但它不必如此。它必须是实用的。只需将 hack 提取到一个名为 download_by_keeping_extension_and_reopen 的方法中,代码看起来就不会那么混乱了。如果您担心资源问题,您可以重新实现 open-uri 的功能:使用 Curb 或任何 http lib 下载,保存到文件,然后打开文件。
  • +1 @Leventix:“优雅”永远不会优雅,因为在某些时候它会变得很混乱。更高层次的语法糖让我们相信事物是优雅的。 Curb、Typhoeus 和其他 HTTP 库也将缓冲到磁盘,而不是只流式传输到内存,因为如果接收到多 GB 的文件,它们会担心填充内存。使用 Net::HTTP 可以通过编写代码将流式传输到内存中,但这很难扩展。
  • @theTinMan 我不介意缓冲,我介意做两次,因为第一次不尊重扩展。这是不雅的部分。
猜你喜欢
  • 2020-10-18
  • 2010-12-21
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2011-02-08
相关资源
最近更新 更多