Após a validação de formulários de entrada de dados, que retornam ao usuário com informações dos erros que devem ser corrigidos, a boa prática de popular os campos com os antigos valores (old) não é possível de ser aplicada aos campos de upload - field files, tanto em PHP Laravel como em qualquer outra linguagem.

Esta é uma medida de segurança dos navegadores para evitar programas maliciosos de tentarem enganar o usuário forçando-o a fazer o upload de arquivos com dados sensíveis.

Segurança no upload de arquivos

Seu site (e qualquer site) não conhece e não deve saber o caminho local para o arquivo que o usuário está fazendo o upload.

Imagine os riscos de segurança se o fizessem! Você poderia enganar um usuário para que ele fizesse o upload de sua chave privada SSH ou algo assim.

O contexto do upload de arquivos em PHP e Laravel antes da validação

Se um arquivo foi selecionado para upload e o formulário enviado, você já recebeu o arquivo por upload em seu script PHP no lado do servidor.

Desta maneira, você pode utilizar este contexto para criar alternativas em seu sistema com o objetivo de simplificar a entrada de dados do usuário quando ele precisa corrigir um campo, sem que necessariamente precise realizar novamente o upload de arquivo já enviado.

O que você precisa fazer é processar o arquivo carregado independentemente, mesmo se houver erros de validação em outros campos do formulário.

Manter referência em disco e campo oculto

Pode-se manter uma referência ao arquivo enviado, gravando em um diretório temporário no disco, e colocá-la em um campo oculto do formulário, então mostrar uma mensagem para indicar ao usuário que você ainda tem o arquivo carregado para que não precise ser substituído / recarregado.

Quando seu formulário for enviado novamente sem um arquivo, você pode verificar o valor do campo oculto e usá-lo para obter sua cópia local do arquivo temporário que foi enviado na última tentativa o usuário.

Limpe os arquivos temporários automaticamente depois que atingirem uma certa idade, e forneça um meio para o usuário mudar de ideia sobre o arquivo que deseja enviar,por exemplo, uma caixa de seleção (marcada por padrão) para cada arquivo armazenado no servidor para upload.

Manter referência em banco de dados

Outra alternativa é armazenar em seu banco de dados com um status pendente ou um hash exclusiva atribuído ao arquivo. Com um hash correspondente armazenado na sessão do usuário.

O objetivo é ser capaz de identificar uploads incompletos que pertencem a esse usuário específico.

Então, ao exibir o formulário, recupere os arquivos incompletos da sessão ou do banco de dados e exiba a miniatura ao lado do upload do arquivo. Isso informa ao usuário que ele não precisa fazer upload do arquivo novamente. Apenas certifique-se de que eles também tenham uma maneira de removê-lo, caso mudem de ideia.

Depois que o formulário for enviado corretamente, limpe o hash da sessão ou atualize o status do banco de dados para concluir; tudo o que você precisa fazer.

Validação de formulário por Ajax

A outra maneira de fazer isso é enviar o formulário via ajax (usando o método iframe para o upload do arquivo) ou fazer uma chamada ajax para validar o formulário primeiro e, em seguida, enviar normalmente o arquivo se as entradas do formulário forem válidas.

Considerações finais

Para oferecer uma melhor experiência do usuário em seu sistema / site é importante pensar nestes detalhes e investir tempo construindo rotinas robustas para a interação da interface com o backend das aplicações.

Se quiser ver código referente a estas sugestões, me procura no Twitter @nunomazer e solicita.