2012-01-19 13 views
34

Non ho idea di come i grandi siti Web salvino le immagini sui loro server. Qualcuno potrebbe dirmi come fanno a salvare le immagini che vengono caricate dagli utenti nel loro database?Qual è il modo migliore per caricare e archiviare le immagini sul sito?

Stavo pensando, forse avrebbero solo salvato il file (l'immagine) in qualche percorso e basta salvare quel percorso nel databse è giusto?

Ma io voglio farlo in questo modo. È giusto? Ad esempio, un sito Web denominato www.photos.com. Quando un utente carica un'immagine, creerò una cartella con il nome utente e salverò quelle immagini in quella cartella.

Credo che possiamo creare una directory utilizzando php file concepts. Quindi, quando un nuovo utente carica la sua immagine o il suo file, voglio creare una directory con il suo nome.

Esempio: se il nome utente è john, vorrei creare una directory come questa su photos.com www.photos.com/john/ e quindi salvare tutte le sue immagini in questa directory quando carica un'immagine. È questo il modo giusto per farlo?

Non ho nessuno qui che abbia una buona conoscenza del salvataggio dei file sui server, quindi per favore fatemi sapere come fare? Voglio farlo nel modo corretto e sicuro.

+2

@AdrianCornish Puoi dirmi cosa intendi con cosa hai provato? Non ti sto chiedendo di scrivere un codice per me, voglio solo l'algoritmo o il processo che la maggior parte delle persone segue in modo da poter andare avanti se so cosa fare – niko

+0

Ancora una volta cosa hai provato? È possibile memorizzare un percorso per il file, è possibile memorizzare i dati binari nel database. Qual è la tua domanda attuale? –

+0

La tua domanda è mal formulata - stai chiedendo come caricare le foto. Non è come memorizzare le immagini caricate sul tuo sito.Inoltre, cosa stai facendo per proteggere gli utenti dal caricare codice dannoso, immagini con payload nascosti, impedire alle persone di afferrare tutte le tue immagini da un URL indicizzabile –

risposta

125

Tutti i grandi siti Web non salvare le immagini nel database li memorizzano nel disco. Salvano un riferimento alla posizione dell'immagine in una tabella. E poi link da lì.

Perché? Prestazione.

Estrarre un contenuto pesante da un database è un collo di bottiglia enorme. E i database non scalano orizzontalmente così bene, quindi significherebbe anche un problema più grande. Tutti i grandi siti utilizzano farm di contenuto statico per gestire contenuti statici come le immagini. Sono i server a cui non importa meno della tua identità.

Come mantengono le foto davvero riservate? Non lo fanno.

Il collegamento dell'immagine è, di per sé, l'indirizzo e la password. Prendiamo Facebook, per esempio. Se memorizzo un'immagine privata sul mio account, non dovresti riuscire ad aprirlo. Ma, finché hai l'indirizzo corretto puoi.

This picture is private. Avviso il nome del file
10400121_87110566301_7482172_n.jpg
(facebook cambia l'url di tanto in tanto in modo che il collegamento può essere annullata)

è non sequenziale. L'unico modo per ottenere l'immagine è conoscere il suo indirizzo.
Sulla base di una precedente foto utente non si può indovinare il prossimo.
Ha un'enorme entropia quindi anche se inizi a prendere ipotesi casuali avrai una grande quantità di fallimenti e, se arrivi a una foto, non sarai in grado, da lì, di realizzare l'identità del proprietario che, di per sé, è la protezione nell'anonimato.

Edit (perché non è necessario memorizzare le immagini in una cartella "nome utente":.
Dopo la tua modifica è apparso chiaro che si fa l'intenzione di mettere i file su disco e non sulla base di dati Questa modifica copre il nuovo scenario .

Anche se la logica (creazione di una cartella per utente) è più organizzata, crea problemi quando si iniziano ad avere molti utenti e molte immagini. Immagina che i tuoi server abbiano uno spazio su disco 1T. E lascia anche immaginare che 1T sia più o meno preciso con il carico che il server può gestire.

Ora hai 11 utenti, supponi che inizino a caricare contemporaneamente e ognuno caricherà più di 100 GB di file. Quando raggiungono 91 GB, il server è pieno e devi iniziare a memorizzare le immagini su un altro server. Se questa struttura utente/cartella viene seguita, dovresti selezionare uno degli utenti e migrare tutti i suoi dati su un altro server. Inoltre, rende difficile un utente che non può caricare più di 1T nei file.

Devo memorizzare tutti i file nella stessa cartella, quindi?
No, i siti di grandi dimensioni generalmente archiviano i file in cartelle sequenziali (/ 000001 /,/000002 /, ecc.) Con un numero x definito di file per cartella. Questo è principalmente per problemi di prestazioni del file system.

Altro su how many files in a directory is too many?

+14

spiegazione BRILLANTE. Esattamente quello che stavo cercando, grazie. – CyberJunkie

+0

Grazie, Frankie, è davvero molto chiaro. Ma c'è un altro modo che dovrebbe essere più interessante: memorizzare le immagini su un fornitore specifico di memorizzazione delle immagini. – Fred

+1

@Fred assolutamente vero. Questa risposta è specificamente progettata per impostare la mentalità corretta su qualcuno che non ha idea di come funzionano le cose. Non appena inizierai a ospitare un paio di milioni di foto sul tuo sito, probabilmente vorrai dividere il problema e/o esternalizzare l'hosting di tali risorse. La mentalità, tuttavia, rimane la stessa. Sul database si fa riferimento solo alla posizione dell'immagine. Grazie per il commento. – Frankie

4

Di solito è una cattiva idea per memorizzare le immagini nel database (se il sito è popolare). Il database è, tradizionalmente, uno dei principali colli di bottiglia nella maggior parte delle applicazioni in circolazione. Non c'è bisogno di caricarlo più del necessario. Se le immagini sono nel filesystem, molti server http (nginx, ad esempio) li serviranno nel modo più efficiente.

Il più grande social network in Russia, Vkontakte fa esattamente questo: memorizza le immagini nel filesystem.

Un altro grande social network ha implementato uno storage blob scalabile e sofisticato. Ma non è disponibile al pubblico, AFAIK.

Sintesi di questa risposta: non memorizzare i BLOB nel database.

1

La gestione delle immagini può essere meglio ottenuta caricando fisicamente le immagini sul server e registrando la posizione del file e i dettagli dell'immagine in un database. Successivamente, è possibile configurare un modulo di ricerca per consentire all'utente di eseguire una ricerca di testo, una ricerca del numero di parte o altre query. È possibile scrivere uno script PHP per produrre un tag immagine HTML valido in base ai dati trovati nella tabella.

caricare immagini in un campo BLOB MySQL ™ è una cattiva idea che tali dati di immagine siano generalmente problematici se le immagini sono molto più grandi delle miniature. Se le immagini sono grandi, si può finire per dover copiare/incollare una istruzione SQL INSERT alla volta (in phpMyAdmin). Se le immagini sono grandi e l'istruzione SQL INSERT è suddivisa in due righe dal tuo editor di testo, non sarai mai in grado di ripristinare l'immagine.

2

è questo il modo giusto di fare

Sì.
L'unica cosa che suggerirei di usare non è il nome ma l'id.
www.photos.com/albums/1234/ andrebbe bene per antipasto.

Problemi correlati