Home > Ruby | コンピュータ | プログラミング | 草稿 > ファイルのダウンロード

ファイルのダウンロード

写真をダウンロードしてみる

Webページに掲載されている写真をローカルにダウンロードします。そのためには写真のURLが必要です。まず、どこか写真の載っているWebページを開いて、そのURLを調べます。多くのWebブラウザでは右クリックをして「画像を開く」などを選ぶことで画像だけを開くことができます。そこからURLを取得します。

1

こうして得られた画像のURLを覚えておきます。今回は

http://chsv.nikon-image.com/jpn/products/camera/slr/digital/d3x/img/sample/pic_009.jpg

とします。

open-uriを使う

おそらく一番お手軽なものはopen-uriを使うことでしょう。require ‘open-uri’することでopenでURLを開くことが可能になります。

require 'open-uri'

filename = ARGV[0].split("/")[-1]

data = open(ARGV[0])
file = open(filename, "w")
file.puts(data.read)
file.close

これを保存して引数にURLを与えるとファイルをダウンロードすることができます。今回は約17MBと大きいものでしたが、無事にダウンロードすることができました。

関連項目

  • URLからファイル名を取り出す
  • 配列の添え字
  • ファイルに記録する

net/httpを使う

より細かい動作をしたいときにはnet/httpがよいでしょう。これを用いるとGET以外にもPUTもできるようになります。

require 'uri'
require 'net/http'

Net::HTTP.version_1_2

uri=URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

file = open(filename, "w")

Net::HTTP.start(uri.host, uri.port) do |http|
	file.puts(http.get(uri.path).body)
end

file.close

Socketを使う(その1)

さらに細かい制御が欲しい場合にはSocketを使うこともできます。

require 'uri'
require 'socket'

uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

puts ARGV[0]
puts filename

file = open(filename, "w")

socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"

# ヘッダを捨てる
file.puts(socket.read.split("\r\n\r\n")[1..-1].join("\r\n\r\n"))

socket.close
file.close

関連項目

  • HTMLのヘッダを捨てる
  • splitとjoin
  • 配列の添え字

Socketを使う(その2)

たとえば1024バイトずつ読んでみることもできます。

require 'uri'
require 'socket'

uri = URI(ARGV[0])
filename = ARGV[0].split("/")[-1]

file = open(filename, "w")

socket = TCPSocket.new(uri.host, uri.port)
socket.puts "GET #{uri.path} HTTP/1.0\r\n"
socket.puts "Host: #{uri.host}\r\n"
socket.puts "\r\n"

# ヘッダを読み飛ばす
header = ""
while true do
	read = socket.recv(1024)
	if read.size == 0 then
		break
	end

	header += read
	response = header.split("\r\n\r\n")
	if response.size != 1 then
		body = response[1..-1].join("\r\n\r\n")
		size = body.size
		file.print(body)
		break
	end
end

while true do
	read = socket.recv(1024)
	if read.size == 0 then
		break
	end
	size += read.size
	puts "read : " + size.to_s + "bytes"
	file.print(read)
end

socket.close
file.close

実行結果

[・・・・]# ruby socket2.rb http://data.tumblr.com/J98fYvxSwi9giuxz1vPx43LSo1_400.jpg
read : 998bytes
read : 2022bytes
read : 2378bytes
read : 3402bytes
read : 4426bytes
read : 5450bytes
read : 6474bytes
read : 7498bytes
read : 8522bytes
read : 8618bytes
read : 9642bytes
(略)

Socketを使う(その3)

非同期読み込みについて。


			

Comments:0

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://blog.neoneet.jp/2009/01/09/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89/trackback/
Listed below are links to weblogs that reference
ファイルのダウンロード from 週刊(月刊?)プレカリアート

Home > Ruby | コンピュータ | プログラミング | 草稿 > ファイルのダウンロード

Search
Feeds
Meta

Page Top