Come servire correttamente grandi file video memorizzati al di fuori di un database MySQL

3

Sto provando a creare un'applicazione Java che si connetta a un database remoto che memorizza e recupera file video che possono superare i 200 MB. Potrei memorizzare / recuperare questi file in MySQL direttamente come LONGBLOB, tuttavia leggo ancora e ancora come sono cattive pratiche per vari motivi. Una soluzione comunemente offerta è quella di archiviare i file sul filesystem e fare in modo che il database memorizzi il file di posizione e lo faccia direttamente dal server.

Il mio problema è che sono molto nuovo nell'archiviazione e sono completamente insicuro su come procedere nel farlo. Devo effettuare una connessione FTP al front-end dopo che è stato richiesto un file video, quindi consegnare quel video tramite quella connessione? O le persone di solito parlano di qualcos'altro quando dicono di estrarlo dal filesystem?

Sto usando Java e JDBC per effettuare chiamate a MySQL.

    
posta dyslexit 06.04.2017 - 19:58
fonte

1 risposta

4

No, archivia i file direttamente su un file system e salva i percorsi relativi . Questo ha diversi vantaggi:

  • migrazione più veloce del database in quanto non contiene TB di dati,
  • non essendo limitato direttamente dalla posizione dello spazio di archiviazione - devi semplicemente anteporre la radice al relativo percorso e lavorare con quello (servirlo ai client dell'applicazione),
  • per alcune risorse, cache nativa HTTP grazie alle intestazioni Last-Modified/ETag e If-Modified-Since/If-None-Match , risparmiando così risorse client 1 ,
  • nel tuo caso semplifica l'implementazione dello streaming di contenuti - consentendo ai client dell'applicazione di recuperare sezioni dei file video, tagliando il file video e restituendo solo un intervallo di byte specifico dal server.

Con i file memorizzati sul filesystem è necessario assicurarsi che siano in una directory che è pubblicamente disponibile (dovrebbe essere, ovviamente). Quindi servi questi file direttamente dal filesystem dal loro percorso.

Supponiamo che la tua applicazione si trovi a /home/dyslexit/www , dove www è una directory disponibile pubblicamente dal browser. All'interno della directory www ne creeresti uno nuovo, es. uploads , che sarebbe anche disponibile al pubblico e utilizzato per archiviare i file. Se dovessi servire un file a un client dell'applicazione, sarebbe semplice come fornire un URI: https://domain.com/uploads/videos/my-video.mp4 , che verrebbe tradotto nel file /home/dyslexit/www/uploads/videos/my-video.mp4 sul server.

Tuttavia non è necessario copiare direttamente la struttura. Se è necessario, invece di servire direttamente i file da un HDD quando viene richiesto un file, è possibile inoltrare la richiesta a uno script controllando le autorizzazioni dell'utente richiedente, negando loro l'accesso nel caso in cui non fosse autorizzato ad accedere a una risorsa oa inoltrarla a il file si trova ovunque, rispettivamente.

1 Ovviamente questo può essere implementato anche se si archiviano file in un database ma richiedono un'ulteriore configurazione e una manipolazione personalizzata dell'intestazione. Quando si servono i file direttamente dal file system, questo è principalmente nativo.

In entrambi i casi, se il tuo obiettivo aziendale non è la memorizzazione di file, ad esempio la creazione di un sistema di archiviazione dati, ma è solo un effetto collaterale del business (supponiamo che tu desideri i video in un'applicazione simile a Facebook) ), la scelta migliore sarebbe probabilmente esternalizzare completamente lo storage di file a un sistema di terze parti dedicato a questa funzione, come Amazon S3.

    
risposta data 07.04.2017 - 09:29
fonte

Leggi altre domande sui tag