Tenho uma visão que imagem deve ficar fora do banco de dados e deve estar acessível pelo sistema de arquivos. Desse modo, o que você armazena no banco de dados são os metadados daquela imagem, como nome do arquivo, tamanho, caminho e etc.
Porém, é claro que você não quer deixar esses arquivos acessíveis. Então, antes de retornar a imagem do sistema de arquivo. Você vai carregar as informações dela no banco de dados a partir dos parâmetros na URL. Além disso, é ideal utilizar um sistema de assinatura na URL para controlar o acesso delas.
Com essa estratégia você pouca espaço no banco de dados, armazena as imagens no sistema de arquivos movendo o arquivo temporário (do upload) para o novo caminho e, depois, adicionando os metadados no banco de dados. Por fim, a URL é gerada com assinatura para ser exibida para o usuário.
Nesse endpoint que lê a imagem, os parâmetros são interpretados e, caso sejam válidos, a imagem é carregada do sistema de arquivos e retornada para o usuário. Tem um longo papo por aqui, mas acredito que essa direção possa te ajudar.