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

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

ただいまの
回答率

90.23%

php(Laravel5.5)でファイルアップロード機能を実装する際のファイル格納先をどこにすればよいか

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 284

gobindar

score 41

 前提・実現したいこと

phpにてファイル(pdf、ppt、xlsx、docx)をアップロードできる
サイトを構築しています。
ファイルアップロードボタンを押すと、
ローカルのファイルを選択でき、
プレビューを表示、
アップロードボタンでサイトにアップロードできる
(アップロードしたファイルが一覧で閲覧でき、ダウンロードもできる)
仕様です。

 発生している問題・エラーメッセージ

アップロードの方法(詳しいソース)はともかく、
ファイルの格納先をどこにするか
(ファイルのままサーバーに格納するのか、データベースに格納するのか)
判断できず困っています。

下記2点の基準で方法を比較したいですが、
他にも判断基準として有力なものがあればご教示頂きたいです。
・処理(アップロード、ダウンロード、プレビュー表示)の速さ
・負荷の大きさ(アップロード中、ダウンロード中に他のユーザーの操作が圧迫されないか)

 試したこと

データベースに格納するとなると、
SQL処理になるので、単に置いてあるファイルよりも、オーバーヘッドが大きい、
ということまでは調べてわかりましたが、
これ以外の情報は掴めていません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

DBには絶対に入れてはいけない。
極一部でセキュリティ上の理由でDBに入れることもあるけど。

Laravelの場合はStorageでlocalならstorage/以下に保存される。
ファイルアップロードのやり方までちゃんとドキュメントに書かれてるからLaravelの普通の使い方をすればいいだけ。
https://readouble.com/laravel/5.5/ja/filesystem.html

local以外ではAWSのS3。
開発時はlocal、本番はS3とenvで切り替える。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/27 18:05

    ご回答有り難うございます。

    AWSを使用するかどうかは一旦検討しますが、
    ご提示頂いたLaravel公式ページを見落としていたので、
    参考になりました。
    ありがとうございます。

    キャンセル

0

ファイルとしておくとアクセシビリティは高いが権限管理などが難しい
DBだとオーバーヘッドが大きいが検索性はたかい
その上でいくつか有効な方法が考えられます

(1)そのままアップロードする

  • メリット:管理側の責任がないため楽
  • デメリット:ファイル名の競合、httpでは非推奨なファイル名(多バイト)
    基本的にはこの方法はNG

(2)ファイル名をエンティティ化してアップロード

  • やり方:"あいう.txt"を"%E3%81%82%E3%81%84%E3%81%86.txt"に変換してアップする
    ファイルだけでやるなら基本的にはこれしかない
  • メリット:http非推奨のファイル名を回避できる、その他そのままとかわらない
  • デメリット:ファイル名の競合、元ファイル名が容易に想像できない

(3)DBに登録

  • メリット:ファイルシステムに依存しない、追加情報をつかって検索性がたかい
  • デメリット:DBにバイナリデータをおくのは無駄

(4)DBには情報だけ登録し、ファイルはファイルとしてアップロード

  • やり方:DB上でユニークな番号または文字列をつくり、その文字列にリネームしてアップ
    たとえば"あいう.txt"がDB上でid:100なら、ファイル名は"100.txt"にする
  • メリット:検索性がたかい
  • デメリット:元ファイル名が完全に変わってしまうのでOS側から見るとなんだかわからない

(5)(4)の微調整:ファイル名の頭にDBで管理する文字列をつけてアップする

  • やり方:"あいう.txt"が、DB上id=100で管理されるなら"100_%E3%81%82%E3%81%84%E3%81%86.txt"に変換してアップする
  • メリット:検索性がたかい、ファイルシステム側からも判断しやすい
  • デメリット:煩雑

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • php(Laravel5.5)でファイルアップロード機能を実装する際のファイル格納先をどこにすればよいか