Самым оптимальным для меня решением является примерно такое:
1. Фронтенд получает файл, создает о нем запись с информацией о файле - размере, времени создания и проч.
2. Фронтенд перенаправляет файл бекенду нужного сервера в сети.
3. Бекенд принимает файл, записывает, и возвращает реальный адрес до файла.
Я не считаю оптимальным хранить информацию о файлах распределенно - все-таки файловые хранилища для этого не предназначены, и использовать их как кластер БД - не самое удачное решение.
Если бы речь шла не о файлах, то я бы использовал XML-RPC/SOAP, т.к. с помощью этих технологий можно наладить платформонезависимое общение фронтенда с множеством бекендов, вне зависимости от используемых на них языках. Но тут файлы, и я не уверен, что через XML-RPC или SOAP можно передавать их без головной боли.