web-dev-qa-db-ja.com

MySQLデータベースの外部に保存されている大きなビデオファイルを適切に提供する方法

私はJavaアプリケーションを構築しようとしています。これは、200MBを超える可能性のあるビデオファイルを格納および取得するリモートデータベースに接続します。これらのファイルをLONGBLOBとしてMySQLに直接格納/取得できます。一般に提供される1つの解決策は、ファイルシステムにファイルを保存し、データベースにロケーションファイルを保存して、サーバーから直接提供することです。

私の問題は、私はストレージに非常に慣れていないため、どのようにそれを実行するかについて完全に確信が持てないことです。ビデオファイルが要求されたら、フロントエンドにFTP接続してから、その接続を介してそのビデオを配信する必要がありますか?または、ファイルシステムからプルするように言ったとき、人々は通常他のことについて話しているのですか?

MySQLを呼び出すためにJavaおよびJDBCを使用しています。

2
dyslexit

いいえ、ファイルをファイルシステムに直接保存し、相対パスを保存します。これにはいくつかの利点があります:

  • tBのデータが含まれていないため、データベースの移行が速くなり、
  • 記憶域の場所によって直接制限されることはありません-ルートを相対パスの前に付加し、そのパスで作業します(アプリケーションクライアントにルートを提供します)。
  • 特定のリソースについては、Last-Modified/ETagおよびIf-Modified-Since/If-None-MatchヘッダーによるネイティブHTTPキャッシングにより、クライアントリソースを節約1
  • あなたの場合、コンテンツストリーミングのより簡単な実装-アプリケーションのクライアントがビデオファイルのセクションを取得できるようにすることにより、ビデオファイルを切り取り、サーバーから特定のバイト範囲のみを返すことにより。

ファイルがファイルシステムに保存されている場合は、それらが公に利用可能なディレクトリにあることを確認する必要があります(もちろん、そうである必要があります)。次に、これらのファイルをパスからファイルシステムから直接提供します。

アプリケーションが/home/dyslexit/wwwにあるとします。ここで、wwwはブラウザから公開されているディレクトリです。 wwwディレクトリ内に、新しいディレクトリを作成します。 uploads。これも公開されており、ファイルの保存に使用されます。その後、アプリケーションのクライアントにファイルを提供する場合、URI:https://domain.com/uploads/videos/my-video.mp4を提供するのと同じくらい簡単で、サーバー上の実際の/home/dyslexit/www/uploads/videos/my-video.mp4ファイルに変換されます。

ただし、構造を直接コピーする必要はありません。ファイルが要求されたときにHDDから直接ファイルを提供する代わりにそれを必要とする場合は、代わりに、リクエストをリクエストしているユーザーの権限を確認するスクリプトにリクエストを転送し、リソースへのアクセスまたはそれらへの転送を許可されていない場合はアクセスを拒否することができますファイルはそれぞれどこかに配置されます。

1 これは、ファイルをデータベースに格納するが、追加のセットアップとカスタムヘッダー操作が必要な場合にも実装できます。ファイルシステムから直接ファイルを提供する場合、これはほとんどがネイティブです。


どちらの方法でも、データストレージシステムを作成するなど、ビジネス目標が実際にファイルを保存することではない場合、それはビジネスの副次的な効果にすぎません(Facebookのようなアプリケーションでビデオが必要だとしましょう)。 Amazon S3など、この機能専用のサードパーティシステムにファイルストレージを完全に外部委託することをお勧めします。

4
Andy