質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    13829questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Webサーバー

    438questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Webシステムにおける写真の取り扱い

解決済

回答 7

投稿

  • 評価
  • クリップ 6
  • VIEW 1,136

bill

score 206

すごくベーシックな質問だとは思うのですが、Webシステムにおいて、写真(jpegやpngファイル)というのはどのように取り扱うのでしょうか?
例えば、アカウントに写真を設定するとなったときに、Javaであれば、そのクラスのフィールドとしてPictureクラスの変数に値を設定すると言った感じになるのではないかと思ったのですが、jpegファイルやpngファイルをそのままデータベースに設定したり、できるのでしょうか?
そのほかのもの(名前やパスワードなど)の取り扱いであればわかりますが、写真の場合どうなるのでしょうか?
回答お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 7

checkベストアンサー

+5

個人的な経験を元に私の感想を書きますが、規模が小さければDBに画像データを格納する方が管理しやすいですが、ある程度の規模(ファイル数や容量)になると、DBとは別のファイルサーバーに画像を保存して、DBにはファイルパスで管理するのが融通が効いて良いですね。

メリット

  • DB、ファイルサーバそれぞれのバックアップを別々に取ることが出来る→DBは高頻度でとりたい。ファイルサーバーはデイリーで良い。など
  • 画像の差し替えや、変換を後からできる→サイズ縮小、高圧縮化、など
  • CDNを使える余地がある→Webサーバーの負荷分散
  • DBの負荷を軽減できる→結合や集約した結果、内部的に一時テーブルを作る場合、BLOB型のデータは性能悪化につながることがあるのと、単純に処理するデータ量が減るので負荷軽減が見込める。

デメリット

  • 別々にリストアしなければいけない
  • 別途ファイルサーバーが必用
  • ネットワーク的に複雑化する
  • 画像の排他制御をプログラムで行う必要がある(必用ならばですが…)
  • ファイル名をユニークに保つ必要が出て来る

なお、Webサーバーのローカルに画像を置く方式もアリですが、Webサーバー自体をスケールアウトした場合や、冗長化した場合に面倒になるので、ファイルサーバーを別に立てるのが良いかなという感じです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 10:10

    teratail回答者の皆さんはシンプルな回答ができずに、すぐに複雑で難しい回答や、質問者が求めている以上の詳細すぎる回答に走りがちです。
    もちろん親切心から良かれと思ってそうしているのだろうと思いますが、でも需要(質問者)と供給(回答者)の次元が違いすぎます。

    質問者のレベルに合わせて答えるならば、一番シンプルに「Webサーバのローカルに画像を置いてパスだけDBに入れろ」がベストだと私は思います。
    スケールアウトだの冗長化だのが必要になったらそのときにまた考えてもいいし、そもそもそんな大規模のサービスを運営するような人がこんなレベルの質問をするでしょうか?

    「近所のコンビニに行くためのオススメ自転車を教えてください」という質問に対して、「自転車ではなく、応用範囲の広い自動車を買ってください。最も性能がいいのはF1マシンです。でもかなりセッティングが難しいのでとりあえず市販車のGT-Rにしておけば云々・・・」などと答えだすのがteratail質問者の悪い意味でのあるあるパターンです。

    キャンセル

  • 2017/02/22 11:25

    ご意見理解しました。私の考え方はとあなたの考えは違うようですが、あなたの言ってることはよくわかります。シンプルな回答は私の目指すところですが、何故そうなのかという事とともに示さないと価値が半減するというのが私の考えでしてつい長くなってしまいました。ただ、質問者のレベルが書かれていない以上、そのレベルに合わせるということは出来ませんので難しい問題ですね。規模についても書かれていませんでしたので、「規模が小さければ…」「ある程度の規模になると…」と条件つきで2つの方式どちらも良いと思う。ということを書いた次第です。メリットやデメリットを書いたのは他の回答への質問者の方のコメントを読んでのことです。

    キャンセル

  • 2017/02/22 17:21

    take88さんの回答内容そのものを否定しているわけではありません。
    相対的なレベル合わせはどうしたら良いかな、という話です。念のため。

    また、take88さんに向かって書いたというよりも、どちらかというとteratail回答者全体の傾向について書いたものですので悪しからず。ご気分を害されましたら申し訳ありません。

    キャンセル

  • 2017/02/22 18:32

    いえいえ、ご意見はよく分かってますので気分を害すと言ったこともありませんので大丈夫です。

    キャンセル

+4

jpegファイルやpngファイルをそのままデータベースに設定したり、できるのでしょうか? 

できます。BLOB型などのキーワードで検索可能だと思います。

ファイル自体をデータベースへ保存せずとも、ファイル自体はサーバーのどこかのディレクトリへ保存しておき、データベースへはそのファイルのパスを保存する方が多いかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 16:47

    サーバのどこかのディレクトリに保存するというのは普通のことなのでしょうか?
    例えば、登録しているユーザー数が多くなってしまったときに、大量のデータがサーバのストレージにあるというふうになってしまうわけですが、それはあまり望ましくないように感じるのです。と言いいますのは大量のデータがある場合に、その取り扱いというのはDBMSを使った場合が一番良いと思うからです。

    キャンセル

  • 2017/02/15 16:57

    「DBMSを使った場合が一番良いと思うからです。」これはサーバーを管理する方(組織/企業)のポリシーによると思うのでどれを選択するかはご自由にとしか言えないです。
    Webサーバーのローカル機材(HDD)に保存しなくてもWebサーバーからアクセス可能な別の機材(SANデバイスなど)へ保存してもいいですし(というよりWebサーバーのスケールアウトを考慮するとローカルのHDDへの保存は選択肢から外れますし。)。

    「大量のデータがサーバのストレージにある」「大量のデータがDBサーバにある」「大量のデータを保存しておく機材を別に用意する」のうち要件にあるものを選択すればいいと思います。
    (バックアップ・リストアやサーバーのスケールアップ/スケールアウトなど考える必要もあるので)

    キャンセル

  • 2017/02/15 17:59

    いまどきだと、AWS S3のような「ファイルを置くのに特化したサービス」も多数あるので、そういうのに任せてしまう、というのも選択肢の1つかなと思います。

    キャンセル

  • 2017/02/16 13:13

    データベースシステムに格納することもできるし、データベースにはファイルへのパスを入れておき、別にストレージを用意することもできるとのことですが、それぞれのメリット・デメリットはどのようになるのでしょうか?
    私個人的にはデータベースに格納できるのであれば、別にストレージサーバなどを用意しない方がよりシンプルな構成になって、いいのではないかと考えているのですが、パフォーマンス等を考慮した場合、どうなのでしょうか?

    キャンセル

  • 2017/02/16 13:24

    普通のデータはともかく、Webサイトに画像を表示するような場合は画像を別リクエストで配信することになるので、画像を表示するためのエントリポイントも必要になって、プログラムとしては煩雑になりますし、DBサーバ・アプリサーバの両方で処理が必要になるので、性能的にもあまり有利ではありません(Data URIを使うとキャッシュできないので、よほど小さな画像以外ではおすすめできません)。

    ただし、「ファイルが散らからない」という点はメリットなので、「キャッシュサーバが入っていて直接のレスポンスタイムがあまり影響しない」、あるいは「頻繁に画像の更新や削除を行うため、ファイルで管理するのが煩雑になる」というような場合はDB保存も有用です。

    キャンセル

  • 2017/02/16 13:38

    あとはDBに保存した場合、データベースのバックアップ時間・容量(およびリストア時間)にも多大な影響が出ます。これとDBサーバーの負荷など考慮し許容できるならDBへ格納でもいいんじゃないでしょうか?
    画像ファイルのサイズが1枚あたり数十MB以上のものを保存する場合はDBへの保存はお勧めしません。

    キャンセル

  • 2017/02/16 13:59

    インラインでHTMLに埋め込んで重くならない程度の画像であればDBに保存することはありますね。
    viewにそのまま渡せて楽なので:-P
    <img src="data:image/png:base64,XXXXXXXXXX" alt="hogehoge">

    キャンセル

+3

まあ、データベースに登録することもできますし、データベースにファイル名を登録して、画像ファイルは物理ファイルでストレージに保存するというやり方もあります。
また、ファイル名を登録しなくても、ユーザーIDや日付などの組み合わせ等により一意なファイル名(もしくはハッシュ)を生成して、そのファイル名でストレージに保存するという方法もあります。
大体この3パターンが使用されると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/15 16:44

    データベースに登録するのではなく、ストレージに保存するというアプローチを取った場合に、ストレージというのはどこのストレージなのでしょうか?

    キャンセル

  • 2017/02/15 16:47

    データベースサーバー(マシン)のストレージや、別にストレージサーバーを立ててそのストレージを使用するというのもあります。

    キャンセル

  • 2017/02/16 13:13

    データベースシステムに格納することもできるし、データベースにはファイルへのパスを入れておき、別にストレージを用意することもできるとのことですが、それぞれのメリット・デメリットはどのようになるのでしょうか?
    私個人的にはデータベースに格納できるのであれば、別にストレージサーバなどを用意しない方がよりシンプルな構成になって、いいのではないかと考えているのですが、パフォーマンス等を考慮した場合、どうなのでしょうか?

    キャンセル

  • 2017/02/16 13:24

    画像はキャッシュ管理をしっかりすればリクエストは減るでしょうが、それでもウェブサーバーが画像に対するリクエストも引き受けるため、負荷が増えてしまいます。ストレージサーバー用意すれば、画像のリンクをストレージサーバーにすることで負荷分散させることができます。

    キャンセル

+1

利用するDBMSによりますが、データベースシステムに格納することは可能です。
http://hijiriworld.com/web/mysql-img-binary/

あるいはファイルシステムと連携し、DBにはファイルシステムのパスを格納し、要求されたら、Webサーバがそれを参照して返却したり、外部から参照できるURLに変換して返却するという方法もあります。
後者の方が一般的かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 13:12

    データベースシステムに格納することもできるし、データベースにはファイルへのパスを入れておき、別にストレージを用意することもできるとのことですが、それぞれのメリット・デメリットはどのようになるのでしょうか?
    私個人的にはデータベースに格納できるのであれば、別にストレージサーバなどを用意しない方がよりシンプルな構成になって、いいのではないかと考えているのですが、パフォーマンス等を考慮した場合、どうなのでしょうか?

    キャンセル

  • 2017/02/16 13:29

    別に用意しておくと、それ単体で冗長化することが可能です。画像へのアクセスが中心のような(インスタグラムとか)サービスを考えると、webサーバへアクセスし、その後に画像が表示されるような流れになります。
    DBに入れるようにすると、webサーバの応答時間が画像の取得、表示までになりますが、分離しておけば、画像の表示部分は別のサーバに依頼することが可能になるといったイメージです。そうすると、画像へのアクセス負荷が高くなった場合、画像サーバのみの負荷分散などを考えれば良いですし、Webアクセスへの影響が少なくて済みます。

    キャンセル

+1

ECサイトを運営していた経験から言えば、画像関係は別サーバで管理したほうがよろしいかと思います。
理由はいくつかあって、一番の理由は運営していく上で日々増えていく画像の数と、そのファイルを転送するための通信量が侮れない為です。
※画像サイズ規制や、適時、利用していない画像を消すという運用が行われなかった場合・・・恐ろしい数値を見ることになるでしょう。

AWS S3に画像ファイルだけを格納するようなやり方でも十分効果はあると思いますが、日々かかる従量課金に見合った運用になっているならば問題はありません。

実際のやり方は、皆さんが提示されているとおりだと思うので書きませんが、webページの表示時間に密接に関係してくるので、違う観点から画像の取り扱いについて書いてみました。

ページ表示2秒でイライラし始め、3分の1は「もういいや」となる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

1.画像ファイルをそのままDBに格納する
→可能です。
<img src="data:image/png;base64,saoifhafwhf....">
と言うような形でHTML上に表示も出来ます。

2.画像ファイルはファイルとしてサーバに置いておき、ファイルのパスだけDB管理する

ID 名前 画像ファイルパス
8012 寺 ている /images/profile/8012.png

3.画像ファイルはWEBサーバ以外の倉庫サーバに置いておき、画像のIDだけDB管理する。(倉庫サーバは画像を返答する機能を実装する。)
ブラウザ → WEBサーバ → 倉庫サーバ
← <img src="http://倉庫/8012"> ←image/jpeg

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/16 13:13

    データベースシステムに格納することもできるし、データベースにはファイルへのパスを入れておき、別にストレージを用意することもできるとのことですが、それぞれのメリット・デメリットはどのようになるのでしょうか?
    私個人的にはデータベースに格納できるのであれば、別にストレージサーバなどを用意しない方がよりシンプルな構成になって、いいのではないかと考えているのですが、パフォーマンス等を考慮した場合、どうなのでしょうか?

    キャンセル

0

データベースシステムに格納することもできるし、データベースにはファイルへのパスを入れておき、別にストレージを用意することもできるとのことですが、それぞれのメリット・デメリットはどのようになるのでしょうか?

既に複数の回答者様がいろいろなメリット・デメリットを書いてくださっているのに、それでもまだ「メリット・デメリットはどのようになるのでしょうか」などと繰り返すとはどういうことですか?
回答を理解できないのか、それともきちんと読んでいないのか?

何にせよメリット・デメリットが自分で想像できないような人は「画像はファイルで保存、パスのみDB」が無難だと思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 20:18

    『自分で想像できないような人は「画像はファイルで保存、パスのみDB」が無難』
    ですよね。基本形を教えてあげるのも大事なことだと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    pngの圧縮

    png画像が圧縮されない JPEGとPNGの画像を圧縮しようとしているのですがJPEGはうまく圧縮されるのに PNGは全く圧縮されません。 試している画像がいけないのか!

  • 解決済

    新しいページに移動

    複数の画面にわたってプログラムを書いていくときに、ひとつの場所(ViewController)に書いていたら長くなりすぎてわからなくなるので、もうひとつファイルを作ることなどは可能

  • 解決済

    javaのクラスパスについての質問

    javaのクラスパスについて、自分なりに正確に頭の中で整理できているか、確認したいと思っています。 基本的でつまらない質問ですが、以下の理解で正解かどうかお聞きしたいです。

  • 解決済

    ImageReader#getFormatNameメソッドの戻り値の

     実現したいこと Javaで画像のフォーマットを調べて、「JPEGのときは~、PNGのときは~」と処理を分岐させたいです。 画像フォーマットは、javax.imageio.Im

  • 受付中

    コンタクトフォーム7で複数の画像を添付できるようにするには

    woedpressのプラグインのコンタクトフォーム7を使用しています。 以下のコードで1枚、画像を添付させることは出来たのですが、複数添付させる方法が分かりません。 [f

  • 解決済

    C++で画像の読み込み、表示

    C++で画像ファイルを読み込んで、その画像を表示させたいんですが、それを行うには、OpenCVというライブラリを使うとできるそうなんですが、OpenCVにはその他色々な機能が備わっ

  • 受付中

    raspberrypi のrootユーザのパスワードを変えたい!!

    raspberry pi のrootユーザのパスワードがわからなくなったので、初期化したいです。 ここで書いてある通り、 >メモリを読むと cmdline.txt なるファイル

  • 解決済

    CMSのNetCommons3の導入にはまってます。VPS上でindex.phpをみたい。500エラ...

    全体的に質問文を整理しました。2017/09/29 目的:NetCommons3というcmsを利用してウェブサイトのデフォルトを見てみたい。 (NetCommons3の取得先:

同じタグがついた質問を見る

  • Java

    13829questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Webサーバー

    438questions

    Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。