如何从rails控制台将图像从url保存到本地ubuntu文件夹?

时间:2016-05-06 12:03:26

标签: ruby-on-rails ruby

我需要从某个网站编写图像解析器,它会获取图像,其他一些信息并保存到我的本地文件夹。 所以,让我们说我们在这个网址上有图像: https://i.stack.imgur.com/MiqEv.jpg (这是某人的SO头像)

所以我想将它保存到本地文件夹。让我们对"~/test/image.png"说 我找到了这个link

我在终端尝试了这个:

rails console

require 'open-uri'
  open('~/test/image.jpg', 'wb') do
  |file| file << open('https://i.stack.imgur.com/MiqEv.jpg').read
end

如您所见,我的home / test文件夹为空 enter image description here

我从控制台获得了这个输出 #<File:~/test/image.jpg (closed)> enter image description here

我该怎么办?

我也尝试过这个:

require 'open-uri'
download = open('https://i.stack.imgur.com/MiqEv.jpg')
IO.copy_stream(download, '~/test/image.jpg')

得到了这个输出:

  

=&GT; #https://i.stack.imgur.com/MiqEv.jpg>,@ meta = {&#34; date&#34; =&gt;&#34;周五,2016年5月6日   格林威治标准时间11:58:05&#34;,&#34;内容类型&#34; =&gt;&#34;图片/ jpeg&#34;,&#34;内容长度&#34; =&gt;&#34 ; 4276&#34 ;,   &#34;连接&#34; = GT;&#34;保活&#34 ;,   &#34;的Set-Cookie&#34; = GT;&#34; __ cfduid = d7f982c0742bf40e58d626659c65a88841462535885;   到期=周六,06-May-17 11:58:05 GMT;路径= /;域= .imgur.com;   HttpOnly&#34;,&#34; cache-control&#34; =&gt;&#34; public,max-age = 315360000&#34;,   &#34; etag&#34; =&gt;&#34; \&#34; b75caf18a116034fc3541978de7bac5b \&#34;&#34;,&#34;到期&#34; =&gt;&#34;周一,04   5月2026年11:58:05 GMT&#34;,&#34;最后修改&#34; =&gt;&#34;星期四,2013年3月28日15:05:35   GMT&#34;,&#34; x-amz-version-id&#34; =&gt;&#34; TP7cpPcf0jWeW2t1gUz66VXYlevddAYh&#34;,   &#34; cf-cache-status&#34; =&gt;&#34; HIT&#34;,&#34;变化&#34; =&gt;&#34;接受编码&#34;,   &#34;服务器&#34; =&gt;&#34; cloudflare-nginx&#34;,&#34; cf-ray&#34; =&gt;&#34; 29ec4221fdbf267e-FRA&#34;},   @metas = {&#34; date&#34; =&gt; [&#34; Fri,2016年5月6日11:58:05 GMT&#34;],   &#34; content-type&#34; =&gt; [&#34; image / jpeg&#34;],&#34; content-length&#34; =&gt; [&#34; 4276&#34;],   &#34;连接&#34; = GT; [&#34;保活&#34],   &#34;的Set-Cookie&#34; = GT; [&#34; __ cfduid = d7f982c0742bf40e58d626659c65a88841462535885;   到期=周六,06-May-17 11:58:05 GMT;路径= /;域= .imgur.com;   HttpOnly&#34;],&#34;缓存控制&#34; =&gt; [&#34; public,max-age = 315360000&#34;],   &#34; etag&#34; =&gt; [&#34; \&#34; b75caf18a116034fc3541978de7bac5b \&#34;&#34;],&#34;到期&#34; =&gt; [&#34;周一,04   5月2026年11:58:05 GMT&#34;],&#34;最后修改&#34; =&gt; [&#34;星期四,2013年3月28日15:05:35   GMT&#34;],&#34; x-amz-version-id&#34; =&gt; [&#34; TP7cpPcf0jWeW2t1gUz66VXYlevddAYh&#34;],   &#34; cf-cache-status&#34; =&gt; [&#34; HIT&#34;],&#34;变化&#34; =&gt; [&#34;接受编码&#34;],   &#34;服务器&#34; =&gt; [&#34; cloudflare-nginx&#34;],&#34; cf-ray&#34; =&gt; [&#34; 29ec4221fdbf267e-FRA&#34;]} ,   @status = [&#34; 200&#34;,&#34; OK&#34;]&gt;   2.3.0:244&gt; IO.copy_stream(下载,&#39;〜/ test / image.jpg&#39;)=&gt; 4276   enter image description here

但是我的文件夹仍然是空的。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

问题是文件没有被创建。如果使用File.openopen创建文件,然后执行`IO.copy_stream&#39;它会起作用。

同样~/在ruby中也不起作用。您必须指定整个路径。

require 'open-uri'
download = open('https://i.stack.imgur.com/MiqEv.jpg')
open('/home/user/image.jpg', 'w')
IO.copy_stream(download, '~/test/image.jpg')

如果您还想创建目录,则必须使用Dir.mkdir用户。如果要创建嵌套目录,请使用FileUtils::mkdir_p。如果难以使用,我建议使用system 'mkdir dirname'system 'mkdir -p dir1/dir2/dir3'

Dir.mkdir '/home/user/test' # doesnt work for nested folder creation

require 'fileutils'
FileUtils::mkdir_p '/home/user/test1/test2' # for nested

system 'mkdir '~/test'   # Unix command for directory creation
system 'mkdir -p '~/test1/test2'   # Unix command for nested directory

希望这有帮助

答案 1 :(得分:0)

如果您使用的是Ubuntu,可以使用wget吗?

您可以同时使用wget 'https://i.stack.imgur.com/MiqEv.jpg'system("wget 'https://i.stack.imgur.com/MiqEv.jpg'")。或system("wget 'https://i.stack.imgur.com/MiqEv.jpg' > /your/path

注意:对于第一个命令,您需要将命令包装到`符号中。这将导致ruby调用系统命令。

另外,请考虑使用/home/your_name而不是~。另请注意前导/斜杠。