Upgrade to Pro — share decks privately, control downloads, hide ads and more …

画像へのアクセス方法の悩み

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for RingoUmaii RingoUmaii
December 13, 2019

 画像へのアクセス方法の悩み

画像へのアクセス方法の悩み
ファイルサーバーを持つべきか
データベースに画像データを保存する方法

Avatar for RingoUmaii

RingoUmaii

December 13, 2019

Other Decks in Technology

Transcript

  1. ファイルサーバー vs データベースサーバー 〜画像の保持にbest practiceはあるのか︖〜 ファイルサーバーに画像を保存 (DBにはファイルサーバーに保存した画像のURLを保存する) データベースに画像を保存 費⽤ ・ファイルサーバーはDBサーバーより安い?

    ・DBは⾼い? パフォーマンス ・ネットワーク速度が早ければ問題ない。 ・レコードが少なければOK ・レコード数が多くなれば画像データは容量が⼤きいので、画像ではな いデータと⽐べて、取得に時間がかかることもある バックアップ ・冗⻑構成、バックアップ構成を考える必要がある ・S3等のクラウドサービスを使うのであれば、お⾦で検討する時間を解 決することも可能 ・DBのバックアップをすると、おのずと画像データもバックアップされ るので、特別に考慮することはなくなる 保存⽅法 ・画像ファイルを変換しないで保持することが可能 ・テーブルにBLOB等のバイナリデータを保持することが可能なカラム に、バイナリデータに変換した画像を保存する 扱いやすさ ・画像の更新にDBを触る必要がなくなるので、関係ない重要なデータを 消す⼼配はない ・DBを更新する何らかのシステムやPGM、またはSQLを介して画像を 更新することになるので、⼿間がかかる
  2. 画像データをbase64エンコーディングで変換 $ irb irb(main):001:0> require 'base64’ Þ true irb(main):005:0> binary_data

    = File.read("/Users/ringoumaii/Documents/study/iconfinder_Santa_Hat_1651937.png") Þ “¥x89PNG¥r¥n¥u001A¥n¥u0000¥u0000¥u0000¥rIHDR¥u0000¥u0000¥u0002¥ 省略︕︕︕” irb(main):025:0> Base64.strict_encode64(binary_data) => "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAAC xMBAJqcGAAAIABJREFUeJzsnXmcHMV5939V1T3X7kqrW0hCB7olEAghcSNuZMAgIQkQQgcSlm/HSez4SBzZ iZ33jRPHjh3f8RHbbxIQNz44DRiMzQ0Gc0hCB7rPva+Z7qr3j9VKs7sz0省略︕︕︕
  3. Base64 データを、アルファベット(A–Z, a–z)と数字(0–9)と記号(+, /, =)でするエンコーディン グ⽅式 =は変換時に余った部分を詰めるための記号として ⽤いられる。 irb(main):001:0> require

    'base64' => true irb(main):054:0> before_text = "EBISU!?" => "EBISU!?" irb(main):055:0> after_text = Base64.strict_encode64(before_text) => "RUJJU1UhPw==" 16進数表記 45 42 49 53 21 3F 2進数表記 01000101 01000010 01001001 01010011 01010101 00100001 00111111 6bitずつに変換(4bit余るので0を4bit分後ろに追加して6bitにする) 010001 010100 001001 001001 010100 110101 010100 100001 001111 110000 ( R U J J U 1 U h P w ) base64の変換表に基づき、4⽂字ごとのかたまりに変換(最後がPwと2⽂字になるので、4⽂字になるように=を2つ追加) RUJJ U1Uh Pw==
  4. base64エンコードすると データサイズが1.3倍に・・・ < base64エンコード前の画像ファイルのサイズ> -rw-r--r--@ 1 ringoumaii study 44375 11

    25 18:59 iconfinder_Santa_Hat_1651937.png <base64エンコードした⽂字列を保存したファイルのサイズ> -rw-r--r-- 1 ringoumaii study 59168 12 13 16:43 after_santa
  5. base64を過去に使ったときは・・・ n どんなシステム︖ - お得情報と⼀緒に画像を保存するシステム(base64エンコードした画像データをBLOB列に格納) - 画像データをbase64エンコードしてデータベースに保存するAPI - base64エンコードした画像データを返すAPI n

    base64を使うとなった理由 ü クラウド使えない、ファイルサーバーを別に持つこともできない (お⾦かけられない、許可もらうのにとても時間がかかる、リリースまで差し迫っている) →既にあるデータベースで何とかするしかなかった ü レコードの量がmaxでも100ぐらいと決まっていた