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

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

ただいまの
回答率

89.10%

[DB]画像アップロードはDBへできるのか?どこへするべき?[cakephp]

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 282

testakaunt

score -3

前提・実現したいこと

サイト制作をしていて、画像アップロードをしたいと思っています。
DB接続もしていて、そこにテーブルを作りimages欄は作っています。
問1.しかし、アップロードされた画像たちはどこへ保存されるべきなんですか?
実務において企業やそこら辺のサイトは上のようにしていますか?
データベースに保存するという形で間違いないんでしょうか。
問2.その場合、inputで名前でも入力して、fileから画像をアップロードしますよね。
その後、データベースに名前を保存して、imageも同じように保存すれば名前だけでなくテーブルのカラムになんらかの形で画像として保存されるんでしょうか?またそのやり方を教えていただけますか?
"公式サイトのどこを見ればわかりますか?"画像に関しては私は見つけられず。
記述の仕方もわからず、困っています。

試したこと

リンク内容

リンク内容
を参考に現在アップロード関係を探っています。参考にしてください。

補足情報(FW/ツールのバージョンなど)

cakephp4

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2020/07/01 20:55

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

回答 7

+2

アップロードされた画像たちはどこへ保存されるべきなんですか?

状況依存です。おおむね「ファイルとしてサーバ上に置いておく」「オブジェクトストレージを使う」というのが主流の選択肢です。

「データベースに入れる」という手もなくはないのですが、ちょっと扱いづらいです。

その後、データベースに名前を保存して、imageも同じように保存すれば名前だけでなくテーブルのカラムになんらかの形で画像として保存されるんでしょうか?

「データベースに画像を入れる処理」はCakePHP標準にはありませんので、やるとすれば自分で書く(もしくはそれを行えるライブラリを使う)必要があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/01 12:23 編集

    CakePHP公式のドキュメントは確認されましたでしょうか?

    https://book.cakephp.org/4/ja/controllers/request-response.html#id6

    キャンセル

+2

アップロードするのがクライアントなら、クライアントが編集可能な領域(ディレクトリ)を
つくっておいてそこにアップするのが妥当です。(ファイル名の競合など避けられます)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/01 12:26 編集

    日本語ファイル名はインターネット上好ましくないのでエンティティ化するなり
    適当に番号を振るなりして別名を使います
    DBにファイルをデータとして登録することは可能ですが、ほぼほぼ容量の無駄遣いなので
    特殊な検索をさせたい場合以外個人的にはメリットは感じません

    キャンセル

  • 2020/07/01 12:49

    検索性だけを考えれば、ファイルは実体としてサーバーにおき、情報だけをDBに
    登録するというやり方もあります。これはこれで煩雑ですがやったことはあります。
    たとえば、アップロードした状態では非表示にしておいて、承認者がOKしたものだけ
    表示にきりかえるなどはDBでやるほうが有利です

    キャンセル

+2

回答

問1.について

DBに画像そのものは保存しないです。

画像ファイル:任意のディレクトリに保存する。
画像ファイルパス:画像ファイルを保存した先のパスを取得する。
DBには画像ファイルパスを保存する。
ということを大体のところがやってると思います。

下記のURLも参考いただければと思います。

問2.について

DBに画像を保存しないので回答はしない、と思いましたが、
「画像 DB 保存 cakephp」で検索すればいろいろHITしたのでそれだけお伝えいたします。

参考

2017/06/21 の質問ですが、DBに画像を保存することのデメリットについてステキな回答があるので参考にしてください。
データベースに画像を保存するのはありでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

まず、DB に画像ファイルのバイナリデータをまるごと入れるのは(blob などのデータ型があるにせよ)しない方がよいでしょう。
入れておいたバイナリを取り出して、<img> タグに入れて表示に使うのに一手間かかってしまうからです。
それよりはどこかにファイルを置いておいて、DB には置き場所の情報さえあれば、<img> タグの src に適切なファイルパスを指定することで簡単に表示できます。
※ただしその場合、referer などでちょく

ちょっと特殊な方法だと、クラウドストレージ(AWS の S3 とか)に置いて、直接リンクさせる手もあります。この場合ファイル名が競合しようが、適切なディレクトリ階層さえ用意できれば問題ありませんし。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

問1.しかし、アップロードされた画像たちはどこへ保存されるべきなんですか?

方針的なものもあると思いますが、環境にもよると思います。

例えば、レンタルサーバーを使っていて、DB は 100MB ぐらいしかないが、サイトのディスク容量は 数GB 与えられているとかですと、DB にはファイル名とか説明のみ保存して画像本体はサイトのディスクに保存せざるを得ないと思います。

DB サーバーの容量が大きくて将来的に容量不足になる可能性を気にしなくて良いなら、画像本体を含めすべて DB に保存した方が管理が楽そうです、が、組織のルールとか方針的なものがあれば話は違うかも。

問2.その場合、inputで名前でも入力して、fileから画像をアップロードしますよね。

ブラウザから画像をアップロードするなら html 要素の input type="file" 要素を使うことが多いと思います。JavaScript / jQuery を使ってアップロードすることも可能です。

その後、データベースに名前を保存して、imageも同じように保存すれば名前だけでなくテーブルのカラムになんらかの形で画像として保存されるんでしょうか?

画像本体を DB に保存するならバイナリーデータを保存できるフィールドを作って、それに保存することになるはずです。

DB サーバーが何かによりますが、例えば SQL Server なら varbinary(max) に画像本体のバイナリーデータを保存します。その他、ファイル名、MIME タイプ、説明などのフィールドも設けて画像に関するすべての情報を一括保存しておくのもよさそうです。

以下は SQL Server の例で、画像をアップロードしたらサーバー側でオリジナル画像を加工してサムネイルと表示用のサイズの小さい画像を作って一緒に保存しています。

イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/01 13:25

    >画像をアップロードしたらサーバー側でオリジナル画像を加工してサムネイルと表示用のサイズの小さい画像を作って一緒に保存
    これをcakephp4で実現できますか?
    公式ドキュメントを見てもいまいちわからなかったんですが、phpでも書き方がわかれば教えていただけますか。
    なんて検索すれば出ますか?見たこともないんですが。

    キャンセル

  • 2020/07/01 13:41 編集

    > これをcakephp4で実現できますか?

    cakephp には触ったこともないので絶対できるとは言えませんが、「cakephp 画像 リサイズ」などでググると参考になりそうな記事が多々ヒットするので、それをちょっと読んだ限りではできると思いますけど? 逆にお聞きしたいですが、cakephp では画像のリサイズができないということがあるのですか? ググって調べるなどしてみたのでしょうか?

    ちなみに、回答の SQL Server のデータは ASP.NET Web Forms アプリで .NET Framework のライブラリを使ってリサイズしたものです。

    キャンセル

  • 2020/07/01 14:07

    画像をリサイズしたければ PHP なら GD ライブラリを使うとか、imagemagick あたりを突っ込んで加工してやれば済む話です。
    CakePHP 単体の機能にはありませんが、実現は難しい話ではありません。

    キャンセル

0

データベースに画像のようなバイナリファイルを保存することは可能です
僕も以前、PHP で実装していました

ただし、

  • データベースに保存する場合
  • Amazon S3 などのオブジェクトストレージに保存する場合

それぞれにメリット・デメリットがあります

O'Reilly Japan - SQLアンチパターン という書籍の
11章 ファントムファイル で非常に詳細に解説されていますので、
設計を決める前に一度確認しておくことをおすすめします

データベースに格納する場合

画像に関する情報画像自体 を別のテーブルに格納して、
外部キーで関連付けておくことをお奨めします

このように設計しておかないと、
たとえば画像の一覧を取得したいときに
SELECT 文が重くなりサービスがダウンする可能性があります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

-7

誰一人として、質問の一つである記述法の解とURLチェックすらしていなかったので、この件に関しては自分で調べることにします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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