Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何通过HTTP将图像文件下载到临时文件中?_Ruby_Uri_Net Http - Fatal编程技术网

Ruby 如何通过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

我找到了用于下载图像文件的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(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")