Eu tenho o WampServer 2 instalado no meu computador com Windows 7. Estou usando o Apache 2.2.11 e o PHP 5.2.11. Quando tento fazer upload de qualquer arquivo de um formulário, ele parece carregar, mas no PHP, a $_FILES
matriz está vazia. Não há arquivo na c:\wamp\tmp
pasta. Eu configurei php.ini
para permitir uploads de arquivos e tal. A tmp
pasta possui privilégios de leitura / gravação para o usuário atual. Estou perplexo.
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>
PHP:
<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>
php
apache
file-upload
elmonty
fonte
fonte
vanilla-upload.php
?Respostas:
Aqui está uma lista de verificação para upload de arquivos em PHP:
Verifique o php.ini para:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
ou.user.ini
se estiver em hospedagem compartilhada e não tiver acessophp.ini
.phpinfo()
função para verificar se suas configurações estão realmente sendo aplicadas.100M
não100MB
.Verifique se sua
<form>
tag possui oenctype="multipart/form-data"
atributo Nenhuma outra tag funcionará, ela deve ser sua tag FORM. Verifique novamente se está escrito corretamente . Verifique novamente se os dados de várias partes / formulário estão cercados por CITAÇÕES Retas, não por aspas inteligentes coladas no Word OU em um blog de site (o WordPress converte aspas retas em aspas angulares!). Se você tiver vários formulários na página, verifique se ambos têm esse atributo. Digite-os manualmente ou tente aspas simples e retas digitadas manualmente.Verifique se você não possui dois campos de arquivo de entrada com o mesmo
name
atributo. Se você precisar oferecer suporte a vários, coloque colchetes no final do nome:Verifique se os diretórios tmp e upload têm as permissões corretas de leitura e gravação definidas. A pasta de upload temporário é especificada nas configurações do PHP como
upload_tmp_dir
.Verifique se o destino do arquivo e os diretórios tmp / upload não possuem espaços.
Verifique se todas
<form>
as páginas da sua página têm</form>
tags fechadas.Verifique se a sua etiqueta FORM possui
method="POST"
. As solicitações GET não oferecem suporte a uploads com várias partes / dados de formulário.Verifique se a tag de entrada do arquivo possui um atributo NAME. Um atributo de ID NÃO é suficiente! Os atributos de ID são para uso no DOM, não para cargas POST.
Verifique se você não está usando Javascript para desativar seu
<input type="file">
campo no envioVerifique se você não está aninhando formulários como
<form><form></form></form>
Verifique sua estrutura HTML para tags inválidas / sobrepostas, como
<div><form></div></form>
Verifique também se o arquivo que você está carregando não possui caracteres não alfanuméricos.
Uma vez, passei horas tentando descobrir por que isso estava acontecendo comigo de repente. Aconteceu que eu havia modificado algumas das configurações do PHP
.htaccess
, e uma delas (ainda não tinha certeza de qual ainda estava) estava causando falha no upload e$_FILES
vazio.Você pode tentar evitar sublinhados (
_
) noname=""
atributo da<input>
tagTente fazer upload de arquivos muito pequenos para diminuir se é um problema de tamanho de arquivo.
Verifique o espaço em disco disponível. Embora muito raro, é mencionado neste comentário da página do Manual do PHP :
Verifique se você não está enviando o formulário através de uma solicitação AJAX POST, em vez de uma solicitação POST normal que faz com que uma página seja recarregada. Analisei todos os pontos da lista acima e finalmente descobri que o motivo pelo qual minha variável $ _FILES estava vazia era porque eu estava enviando o formulário usando uma solicitação AJAX POST. Eu sei que também existem métodos para fazer upload de arquivos usando ajax, mas esse pode ser um motivo válido para a matriz $ _FILES estar vazia.
Fonte para alguns desses pontos:
http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
fonte
<form><form><input type="file"></form></form>
$('#my-form')[0].reset();
no manipulador de envio.No que diz respeito ao HTML, você parece ter configurado essa parte corretamente. Você já tem o
enctype="multipart/form-data"
que é muito importante ter no formulário.Quanto à sua
php.ini
configuração, às vezes nos sistemasphp.ini
existem vários arquivos. Certifique-se de editar o correto. Sei que você disse que configurou seuphp.ini
arquivo para fazer upload de arquivos, mas você também definiuupload_max_filesize
epost_max_size
é maior que o arquivo que está tentando enviar? Então você deve ter:O seu diretório:
"c:\wamp\tmp"
possui permissões de leitura e gravação? Você se lembrou de reiniciar o Apache depois de fazer asphp.ini
alterações?fonte
É importante adicionar
enctype="multipart/form-data"
ao seu formulário, exemplofonte
Obrigado a todos pelas várias respostas abrangentes. Tudo isso é muito útil. A resposta acabou sendo algo muito estranho. Acontece que o PHP 5.2.11 não gosta do seguinte:
ou
Se eu mudar para
2047M
, o upload funcionará.fonte
Eu tenho o mesmo problema procurando 2 horas, é muito simples verificarmos primeiro a configuração do servidor.
Exemplo:
qualquer tipo de tamanho de arquivo é
:20mb
, mas o nossoupload_max_size
está acima,20mb
mas o array énull
. A resposta é a nossapost_max_size
deve ser maior queupload_max_filesize
fonte
Aqui, outra causa que encontrei: Ao usar o JQuery Mobile e o atributo de formulário data-ajax estiver definido como true, a matriz FILES ficará vazia. Portanto, defina data-ajax como false.
fonte
Verifique se o seu elemento de entrada possui um atributo 'name'.
<input type="file" name="uploadedfile" />
Se isso estiver faltando, o $ _FILES estará vazio.
fonte
Eu estava lutando com o mesmo problema e testando tudo, não obtendo relatórios de erro e nada parecia estar errado. Eu tinha error_reporting (E_ALL) Mas, de repente, percebi que não havia verificado o log do apache e pronto! Houve um erro de sintaxe no script ...! (um "}" ausente)
Portanto, mesmo que isso seja algo evidente a ser verificado, pode ser esquecido ... No meu caso (linux), está em:
fonte
Ninguém mencionou isso, mas isso me ajudou e não há muitos lugares na rede que o mencionem.
Verifique se o seu php.ini define a seguinte chave:
Você precisará verificar com seu host se eles querem que você use um caminho absoluto de arquivo do servidor. Você poderá ver outros exemplos de diretório no seu arquivo php.ini para determinar isso. Assim que eu defini, obtive valores no meu objeto _FILES.
Por fim, verifique se a pasta tmp e onde quer que você esteja movendo os arquivos têm as permissões corretas para que possam ser lidas e gravadas.
fonte
Se você está tentando fazer upload de um conjunto de arquivos, então você pode precisar de aumentar
max_file_uploads
emphp.ini
que é pelo conjunto padrão de20
Nota :
max_file_uploads
NÃO pode ser alterado fora do php.ini. Veja o PHP "Bug" # 50684fonte
Outro possível culpado é o redirecionamento do apache. No meu caso, eu tinha o httpd.conf do apache configurado para redirecionar determinadas páginas do nosso site para versões http e outras páginas para versões https da página, se elas ainda não estavam. A página na qual eu tinha um formulário com uma entrada de arquivo era uma das páginas configuradas para forçar o SSL, mas a página designada como a ação do formulário foi configurada para ser http. Portanto, a página enviava o upload para a versão ssl da página de ação, mas o apache o redirecionava para a versão http da página e os dados da postagem, incluindo o arquivo enviado, foram perdidos.
fonte
Verifique seu php.ini em enable_post_data_reading = On , porque:
Em http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading
fonte
Se o seu script principal tiver
http://Some_long_URL/index.php
cuidado, especifique o URL completo (com explícitoindex.php
e não apenashttp://Some_long_URL
) noaction
campo. Surpreendentemente, se não, o script certo é executado, mas com $ _FILES!fonte
Encontrei o mesmo problema e descobri que o meu IDE fazia parte do problema. Eu estava iniciando o depurador diretamente do IDE (PHPStorm) em vez de apenas usar o navegador diretamente. O URL gerado pelo IDE era assim:
e apenas usando:
funcionou muito bem. Minha configuração é PC / Windows 10 / WAMPSERVER 3.0.6 64bit
fonte
Não confie no local da pasta temporária fornecido
sys_get_temp_dir
se você estiver em um ambiente de hospedagem compartilhada.Aqui está mais uma coisa a verificar que ainda não foi mencionada ...
Eu assumi, naturalmente, que a pasta onde meu script PHP armazenava uploads temporários de arquivos era
/tmp
. Essa crença foi reforçada pelo fato de queecho sys_get_temp_dir() . PHP_EOL;
retorna/tmp
. Além disso,echo ini_get('upload_tmp_dir');
não retorna nada.Para verificar se o arquivo carregado aparece de fato brevemente na minha
/tmp
pasta, adicionei umasleep(30);
declaração ao meu script (como sugerido aqui ) e naveguei para a minha/tmp
pasta no cPanel File Manager para localizar o arquivo. No entanto, não importa o quê, o arquivo enviado não foi encontrado em nenhum lugar.Passei horas tentando determinar o motivo disso e implementei todas as sugestões oferecidas aqui.
Finalmente, depois de pesquisar os arquivos do meu site em busca da
tmp
descoberta, descobri que meu site continha outras pastas nomeadastmp
em diretórios diferentes. Percebi que meu script PHP estava gravando os arquivos enviados para.cagefs/tmp
. (A configuração "Mostrar arquivos ocultos" deve estar ativada no cPanel para exibir esta pasta.)Então, por que a
sys_get_temp_dir
função retorna informações imprecisas?Aqui está uma explicação da página do PHP.net para
sys_get_temp_dir
(ou seja, o comentário principal):Esta postagem do SO também investiga o problema:
fonte
Eu tenho o mesmo problema e nenhum dos temas foi meu erro. Verifique no seu arquivo .htaccess, se você tiver um, se "MultiViews" estiver ativado. Eu tive que desativá-los.
fonte
Eu tive um problema semelhante e o problema estava no valor errado no htaccess, como shamittomar mencionou.
Mude
php_value post_max_size 10MB
paraphp_value post_max_size 10M
fonte
Eu estava vazio
$_FILES
porque depois que<form enctype="multipart/form-data" method="post">
eu coloqueiO código inicial era como
Eu decidi modificar e
Portanto, a conclusão é que depois
<form enctype="multipart/form-data" method="post">
deve ser<input name, type, id
e não deve ser<div>
ou algumas outras tagsNa minha situação, o código correto era
fonte
Eu também tive problemas com $ _FILES vazios. A lista de verificação acima não menciona MultiViews em .htaccess, httpd.conf ou httpd-vhost.conf.
Se você tiver MultiViews definidos na diretiva de opções do seu diretório que contém o site, $ _FILES estará vazio, mesmo que o cabeçalho Content-Length esteja mostrando que o arquivo foi carregado.
fonte
Se você estiver usando o JQuery Mobile
O uso de um formulário de várias partes com uma entrada de arquivo não é suportado pelo Ajax. Nesse caso, você deve decorar o formulário pai com data-ajax = "false" para garantir que o formulário seja enviado corretamente ao servidor.
fonte
Desanexe o formulário da página que você está usando em uma página php simples que possua apenas o formulário e o código php, e teste-o assim.
Qualquer script de inicialização ou java pode limpar o _FILES []. Esse foi o meu caso
fonte