Shoken Startup Blog

KitchHike Founder/CTO

MongoDBへ画像ファイルをバイナリで保存/取得

MongDBへローカルファイルの画像をバイナリで保存/取得するサンプルコードです。

環境

OS CentOS 5.4
ruby 1.9.3
mongo 1.6.1
MongoDB 2.0.4

MongoDBへ画像ファイルをバイナリで保存

#!/usr/local/bin/ruby
# -*- encoding: utf-8 -*-

require 'mongo'

#第1引数=保存する画像ファイル名,第2引数=保存先database,第3引数=保存先コレクション
if (ARGV.size < 3)
  puts
  puts 'Usage: ARGV[0]=file_name ARGV[1]=db_name ARGV[2]=collection_name'
  puts
  exit
end

db_name = ARGV[1]
coll_name = ARGV[2]

db = Mongo::Connection.new.db(db_name)
coll = db.collection(coll_name)

file_name = File.basename(ARGV[0])
image = File.open(ARGV[0], "r+b")

puts "insert to #{db_name}.#{coll_name} from local file '#{file_name}'"
coll.insert({:image => BSON::Binary.new(image.read,
                                        BSON::Binary::SUBTYPE_BYTES),
             :file_name => file_name
            })

db.connection.close

使用例

[root@xxx ~]# ruby insert_image_to_mongodb.rb input.png test image_collection
insert to test.image_collection from local file 'input.png'

MongoDBから画像ファイルを取得

#!/usr/local/bin/ruby
# -*- encoding: utf-8 -*-

require 'mongo'

#第1引数=取得する画像ファイル名,第2引数=保存先database,第3引数=保存先コレクション
if (ARGV.size < 3)
  puts
  puts 'Usage: ARGV[0]=file_name ARGV[1]=db_name ARGV[2]=collection_name'
  puts
  exit
end

db_name = ARGV[1]
coll_name = ARGV[2]

db = Mongo::Connection.new.db(db_name)
coll = db.collection(coll_name)

file_name = File.basename(ARGV[0])
result = coll.find_one({"file_name" => file_name})

puts "save image to local file as '#{file_name}'"
File.open(file_name, "w+b").write(result['image'].to_s)

db.connection.close

使用例

[root@xxx ~]# ruby get_image_from_mongodb.rb out.png test image_collection
save image to local file as 'out.png'