Ruby 如何通过HTTP将图像文件下载到临时文件中?
我找到了用于下载图像文件的NET::HTTP,以及创建临时文件的方法。但我不知道如何将这些库一起使用。也就是说,如何将临时文件的创建工作转化为下载二进制文件的代码Ruby 如何通过HTTP将图像文件下载到临时文件中?,ruby,uri,net-http,Ruby,Uri,Net Http,我找到了用于下载图像文件的NET::HTTP,以及创建临时文件的方法。但我不知道如何将这些库一起使用。也就是说,如何将临时文件的创建工作转化为下载二进制文件的代码 require 'net/http' Net::HTTP.start("somedomain.net/") do |http| resp = http.get("/flv/sample/sample.flv") open("sample.flv", "wb") do |file| file.write
require 'net/http'
Net::HTTP.start("somedomain.net/") do |http|
resp = http.get("/flv/sample/sample.flv")
open("sample.flv", "wb") do |file|
file.write(resp.body)
end
end
puts "Done."
与
Net::HTTP
相比,api友好库更多,例如:
需要“net/http”
需要“临时文件”
需要“uri”
def保存到临时文件(url)
uri=uri.parse(url)
Net::HTTP.start(uri.host,uri.port)do | HTTP|
resp=http.get(uri.path)
file=Tempfile.new('foo',Dir.tmpdir,'wb+'))
file.binmode
file.write(resp.body)
file.flush
文件
结束
结束
tf=将_保存到_临时文件('http://a.fsdn.com/sd/topics/transportation_64.png')
tf#=>#
我喜欢使用RestClient:
file = File.open("/tmp/image.jpg", 'wb' ) do |output|
output.write RestClient.get("http://image_url/file.jpg")
end
虽然上面的答案很好,但我想我会提到,也可以使用好的ol'
curl
命令将文件下载到临时位置。这是我自己需要的用例。下面是代码的大致概念:
#设置临时文件:
file=Tempfile.new(['filename','.jpeg']))
#提出卷曲请求:
url=”http://example.com/image.jpeg"
curlString=“curl--silent-xget\”{url}\“-o\”{file.path}\”
curlRequest=`{curlString}`
如果您想使用HTTParty下载文件,可以使用以下代码
resp = HTTParty.get("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png")
file = Tempfile.new
file.binmode
file.write(resp.body)
file.rewind
此外,如果要将文件存储在ActiveStorage中,请参阅下面的代码
object.images.attach(io: file, filename: "Test.png")
@maerics,我更新了问题-你提交的编辑正确吗?我怀疑你的代码看起来像是第一个示例的直接副本。当你将
打开(“sample.flv”)…
部分替换为从Tempfile文档中读取的内容时会发生什么?@Shadwell;这是我发布的第一个例子。好的,那么maerics的问题仍然有效。到目前为止你试过什么?(我认为不仅仅是运行第一个示例中的代码并希望它神奇地工作!)谢谢;我正在寻找一个二进制模式下的httparty示例,如下所示。@fguillen是的,我看到了+1.谢谢:)考虑到它是一个图像文件,您可能需要在开始写入文件之前设置f.binmode
。@MariusButuc建议已添加。f.binmode
已包含在文件打开模式wb
中f.close
是多余的,因为文件.open
块将始终关闭文件。我在Rails中使用ruby 2.0运行时遇到一个编码错误:encoding::UndefinedConversionError:“\x89”从ASCII-8BIT到UTF-8@Dogweather然后执行resp.body.force_编码(“ASCII-8BIT”)
并尝试相同的操作。修复程序正在添加“file.binmode”。只是提醒一下,如果URL包含参数,例如S3认证的URL,这将不起作用。
object.images.attach(io: file, filename: "Test.png")