Moin!
Schau Die mal die Dokumentation zu move_uploaded_file() auf php.net und besonders den dortigen Beitrag den Nutzers "brentwientjes" vom 15-Feb-2010 07:34 an.
Die Vorgehensweise selbst ist relativ trivial:
Die notwendigen Daten stehen alle in $_File. Aus Sicherheitsgründen wird geprüft, ob es wirklich(!) Grafiken sind und diese werden im Beispiel von "brentwientjes" auch gleich in der Größe verringert - das spart ggf. Speicherplatz und Serverleistung beim Ausliefern - führt andererseits aber manchmal zu unschönen Ergebnissen (z.B. bei Transparenzen in png-Dateien).
Das Du die Datenbank nicht brauchst hatten wir schon geklärt. Das Dateisystem ist genau genommen nämlich schon eine - und übrigens eine sehr effektive (schnelle), wenn auch mit erheblichen Einschränkungen.
Ein ganz anderes Problem ist die Tatsache, dass Du natürlich die Dateinamen selbst vergeben musst. Wie wäre es, es handelt sich ja um Avatare, mit der Idee, diese wie den jeweiligen User zu benennen. Damit hast Du dann auch eine tolle Möglichkeit diese Dateien z.B. gemeinsam mit dem User zu löschen. Das Ausliefern eines Ersatzbildes übernimmt am billigsten der 404er Reaktionsmechanismus des Servers in einer lokalen .htaccess-Datei - sofern Du den Apache benutzt.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix