2014年6月8日日曜日

iOSのUIImageをNSDataにしてNSStringにして、リモートのRailsで保存

本来なら、
UIImage → NSData → NSString →

====parse====

→ Railsで保存

取り出すときは、
Rails→

====parse====

→ NSString → NSData → UIImage

すればいいものを、無駄に
AESでencodeしてとか考えていたら、時間が経ってしまいました。



まずは、保存の仕方
imageはUIImage

NSData* imageData = [[NSData alloc] initWithData:UIImagePNGRepresentation(image)];
NSString* base64str = [imageData base64EncodedStringWithOptions:0];
これでstring型でRailsで保存できる。
もしmongoidでバイナリーデータで保存したいなら、

class Image
  include Mongoid::Document
  include Mongoid::Timestamps
  field :image_num, type: Integer
  field :image_manager_id, type: String
  field :data
  belongs_to :image_manager
  def self.save_from_profile(image_data, user)
    image_manager = user.image_manager
    image1 = Image.new(image_manager_id: image_manager.id, image_num: 1, data: BSON::Binary.new(image_data))
    image1
  end
end



取り出すときは、
Rails
image = Image.find(params["image_id"])
image_data = image.data

iOS

NSString* dataString = results[@"data"];
NSData* deData = [[NSData alloc] initWithBase64EncodedString:dataString options:0];
UIImage* tmpImage = [[UIImage alloc] initWithData:deData];

できてしまえば、そりゃそうかという感じです。

本当は、googleDriveとかdropboxとかflickrとかTumblrとか
外部サービスをサーバー代わりに利用して、
UIImageのデータを保存して、
経費節約しようとか考えていたんですが、
結局サーバー持たずに直接iOSと通信はできないっぽい。

parse.comでそんなことができるみたいですが、なんかある程度まで行くと月1万とかかかるみたいなんで、諦めて自分のサーバーに保存することになりました。笑

ややこしく考えすぎた。。ふぅ

[参考]
Base64 Decoding in iOS 7+/Github