Esquecendo a complexidade adicional de serviços como AWS S3, vamos para o basico:
- Não pode salvar no servidor?
Claro que pode, porém você deve saber aonde está salvando, pois determinados diretórios podem ser sobre escritos (por exemplo a pasta vendor de um projeto PHP ou a pasta node_modules de um projeto node).
Além disso, você precisa se preocupar com o backup desses arquivos (da mesma forma que precisa se preocupar com backup do banco)
- Faça o upload para uma pasta privada e sanitize o arquivo
O arquivo ao ser feito upload deve ser movido para uma pasta que não é acessível diretamente pelo webserver.
Também é uma boa pratica verificar se o arquivo está no tamanho e formato que deveriam estar, e descartar caso contrário.
Além disso é uma boa prática mudar o nome do arquivo para algo aleatório, e se necessário guardar o nome original no banco de dados.
- Guarde referência do arquivo no banco de dados
No seu bando devera haver uma tabela para representar os arquivos, mostrando aonde o arquivo de fato está salvo
- Crie endpoints para manusear os arquivos
Se o arquivo não está publico no servidor, então precisamos de um endpoint que entregue o arquivo quando solicitado