我需要从某个网站编写图像解析器,它会获取图像,其他一些信息并保存到我的本地文件夹。 所以,让我们说我们在这个网址上有图像: 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
我从控制台获得了这个输出
#<File:~/test/image.jpg (closed)>
我该怎么办?
我也尝试过这个:
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
但是我的文件夹仍然是空的。 我该怎么办?
答案 0 :(得分:1)
问题是文件没有被创建。如果使用File.open
或open
创建文件,然后执行`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
而不是~
。另请注意前导/
斜杠。