gpt4 book ai didi

ruby-on-rails - rails : open() returns StringIO instead of Tempfile

转载 作者:行者123 更新时间:2023-12-04 07:40:38 24 4
gpt4 key购买 nike

我有两个指向两个图像的有效 URL。
当我在第一个 URL 上运行 open() 时,它返回一个 Tempfile 类型的对象(这是雾 gem 期望将图像上传到 AWS 的对象)。
当我在第二个 URL 上运行 open() 时,它返回一个 StringIO 类型的对象(这会导致雾 gem 崩溃和燃烧)。

为什么 open() 不返回第二个 URL 的临时文件?
此外,是否可以强制 open() 始终返回 Tempfile?

从我的 Rails 控制台:

2.2.1 :011 > url1
=> "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpf1/v/t1.0-1/c0.0.448.448/10298878_10103685138839040_6456490261359194847_n.jpg?oh=e2951e1a1b0a04fc2b9c0a0b0b191ebc&oe=56195EE3&__gda__=1443959086_417127efe9c89652ec44058c360ee6de"
2.2.1 :012 > url2
=> "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xfa1/v/t1.0-1/c0.17.200.200/1920047_10153890268465074_1858953512_n.jpg?oh=5f4cdf53d3e59b8ce4702618b3ac6ce3&oe=5610ADC5&__gda__=1444367255_396d6fdc0bdc158e4c2e3127e86878f9"
2.2.1 :013 > t1 = open(url1)
=> #<Tempfile:/var/folders/58/lpjz5b0n3yj44vn9bmbrv5180000gn/T/open-uri20150720-24696-1y0kvtd>
2.2.1 :014 > t2 = open(url2)
=> #<StringIO:0x007fba9c20ae78 @base_uri=#<URI::HTTPS https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xfa1/v/t1.0-1/c0.17.200.200/1920047_10153890268465074_1858953512_n.jpg?oh=5f4cdf53d3e59b8ce4702618b3ac6ce3&oe=5610ADC5&__gda__=1444367255_396d6fdc0bdc158e4c2e3127e86878f9>, @meta={"last-modified"=>"Tue, 25 Feb 2014 19:47:06 GMT", "content-type"=>"image/jpeg", "timing-allow-origin"=>"*", "access-control-allow-origin"=>"*", "content-length"=>"7564", "cache-control"=>"no-transform, max-age=1209600", "expires"=>"Mon, 03 Aug 2015 22:01:40 GMT", "date"=>"Mon, 20 Jul 2015 22:01:40 GMT", "connection"=>"keep-alive"}, @metas={"last-modified"=>["Tue, 25 Feb 2014 19:47:06 GMT"], "content-type"=>["image/jpeg"], "timing-allow-origin"=>["*"], "access-control-allow-origin"=>["*"], "content-length"=>["7564"], "cache-control"=>["no-transform, max-age=1209600"], "expires"=>["Mon, 03 Aug 2015 22:01:40 GMT"], "date"=>["Mon, 20 Jul 2015 22:01:40 GMT"], "connection"=>["keep-alive"]}, @status=["200", "OK"]>

这就是我使用雾的方式:
tempfile = open(params["avatar"])
user.avatar.store!(tempfile)

最佳答案

我假设您正在使用 Ruby 的内置 open-uri允许您使用 open() 下载 URL 的库.

在这种情况下,Ruby 只需要返回一个 IO目的。不能保证它将是一个文件。我的猜测是 Ruby 根据内存消耗做出决定:如果下载量很大,则将其放入文件中以节省内存;否则它会用 StringIO 将它保存在内存中.

作为一种解决方法,您可以编写一个方法,将流写入临时文件(如果尚未下载到文件):

def download_to_file(uri)
stream = open(uri, "rb")
return stream if stream.respond_to?(:path) # Already file-like

Tempfile.new.tap do |file|
file.binmode
IO.copy_stream(stream, file)
stream.close
file.rewind
end
end

如果您正在寻找具有类似功能的全功能 gem,请查看“向下”: https://github.com/janko-m/down

关于ruby-on-rails - rails : open() returns StringIO instead of Tempfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com