O envio de ficheiros falha com “failed to open stream” ou move_uploaded_file: as causas, por ordem

O ficheiro chega ao servidor, o PHP guarda-o numa pasta temporária e o seu código tenta mudá-lo para o sítio definitivo com move_uploaded_file(). Se esse passo falha, o aviso é “failed to open stream: Permission denied”, “No such file or directory” ou “Unable to move”. Não é um problema de tamanho (para isso há enviar ficheiros grandes em PHP), é de caminho, permissões ou espaço. Há uma maneira de ver a causa: o código de erro do $_FILES.

Ler o código de erro do envio

Antes de mover o ficheiro, o PHP deixa em $_FILES['campo']['error'] um número. Imprima-o numa página de ensaio, ou escreva-o no registo de erros.

Código Significa O que fazer
0 O envio correu bem. Se mesmo assim falha, o problema é o passo seguinte: mover o ficheiro.
1 Maior do que o limite do PHP. Veja upload_max_filesize e post_max_size.
2 Maior do que o limite do próprio formulário. Procure um campo MAX_FILE_SIZE escondido no formulário.
3 Só chegou uma parte. Ligação cortada. Tente outra vez, com uma rede melhor.
4 Nenhum ficheiro enviado. Veja se o formulário tem enctype="multipart/form-data". Sem isso o $_FILES chega vazio.
6 Falta a pasta temporária. Peça-nos ajuda: é do servidor.
7 Não conseguiu escrever no disco. Pode ser o espaço da conta esgotado. Veja o contador no cPanel.
8 Uma extensão do PHP parou o envio. Peça-nos ajuda com o endereço e a hora.

Se o código é 0 e mover falha

1 A pasta de destino existe? “No such file or directory” é quase sempre um caminho errado. Um caminho relativo muda consoante o ficheiro que o chama. Prefira um caminho completo, construído a partir de __DIR__.
2 A pasta aceita escrita? Em geral a pasta deve pertencer à sua conta e ter permissão 755 (e os ficheiros 644). “Permission denied” numa pasta que criou há pouco, ou que foi criada por outro utilizador (num VPS, o root), é a causa mais comum. Veja erro 403: permissões, .htaccess e IPs bloqueados. Não ponha 777 por desespero.
3 O espaço acabou? O disco da conta cheio, ou o limite de ficheiros (inodes), faz a escrita falhar. Veja os limites de que ninguém fala.
4 O nome do ficheiro tem caracteres difíceis? Espaços, acentos ou o nome vazio dão problemas. Gere o seu próprio nome (uma sequência aleatória mais a extensão) em vez de usar o que o utilizador enviou.
5 Leia o registo de erros: ele traz o caminho exacto que falhou. Veja onde está o registo de erros do PHP.
Cuidado com o que permite enviar. Se a pasta de destino está dentro do site e o utilizador pode enviar um ficheiro .php, quem o enviar corre código no seu servidor. Aceite só os tipos de que precisa, confira o tipo pelo conteúdo (e não só pela extensão), renomeie o ficheiro e, se puder, guarde-o fora da pasta pública.
Em WordPress o erro aparece como “HTTP error” ou “Não foi possível mover o ficheiro”. Veja aumentar o limite de envio do WordPress. Se o envio é muito grande ou frequente, use o SFTP: veja SFTP em vez de FTP.

Já viu o código de erro e o caminho e ainda falha? Envie-nos a mensagem completa e o endereço da página.

Abrir um pedido de suporte

VEJA TAMBÉM

Enviar ficheiros grandes em PHP: upload_max_filesize e post_max_size

Erro 403: permissões, .htaccess e IPs bloqueados

Onde está o registo de erros do PHP

Os limites de que ninguém fala: inodes, processos e memória

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde R$ 36,30/mês (plano de 3 anos, com cupom)

Ver planos
  • 0 Usuários acharam útil
Esta resposta lhe foi útil?