Manipulando dados de formulários com PHP – Parte 2 (Upload de Arquivos)
2 - Manipulando com o script PHP os arquivos enviados
Assume-se que o formulário acima foi postado enviando um arquivo.
Automaticamente em "script.php" (o action do formulário exemplo), será criado as seguintes variáveis:
$_FILES['arquivo']['name']
- O nome original do arquivo no computador do usuário.
$_FILES['arquivo']['type']
- O tipo mime do arquivo, se o navegador deu esta informação. Exemplo: caso uma imagem GIF tenha sido enviada, o mime será: "image/gif".
$_FILES['arquivo']['size']
- O tamanho em bytes do arquivo.
$_FILES['arquivo']['tmp_name']
- O nome temporário do arquivo, como está guardado no servidor.
$_FILES['arquivo']['error']
- O código de erro associado a este upload de arquivo. Essa opção foi adicionada na versão 4.2.0 do PHP.
Observações:
- Em versões anteriores do PHP a 4.1.0 use a variável $HTTP_POST_FILES e não a variável superglobal $_FILES que foi introduzida na versão 4.1.0;
- No lugar de 'arquivo' use o nome do seu campo "file" do formulário;
- Se a opção de configuração do PHP register_globals estiver como "on", você pode usar uma variável com o nome do campo de formulário, exemplo: $arquivo_name, $arquivo_size, etc. Mas, usar dessa maneira não é o recomendável, procure sempre usar a superglobal $_FILES.
O preferível no começo de "script.php" é passar a $_FILES para outra variável, por exemplo:
$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
$arquivo2 = isset($_FILES['arquivo2']) ? $_FILES['arquivo2'] : FALSE;
[... etc ...]
Os arquivos enviados pelo formulário serão guardados no diretório temporário do servidor, a menos que outro lugar seja especificado com a opção upload_tmp_dir no php.ini. E o caminho e nome de cada arquivo, são ditos na $_FILES['arquivo']['tmp_name'].
Para mover o arquivo para um diretório desejado deve-se usar a função move_uploaded_file() (em versões anteriores a 4.0.3 use a função copy).
Vamos então ao que interessa! O código de "script.php":
Esse é o código mínimo que seu script de upload deve conter. Mas, o mesmo ainda não é seguro, pois não faz nenhuma verificação no arquivo, seja de tamanho, nome, tipo, etc. O próximo tópico aborda isso.
Assume-se que o formulário acima foi postado enviando um arquivo.
Automaticamente em "script.php" (o action do formulário exemplo), será criado as seguintes variáveis:
$_FILES['arquivo']['name']
- O nome original do arquivo no computador do usuário.
$_FILES['arquivo']['type']
- O tipo mime do arquivo, se o navegador deu esta informação. Exemplo: caso uma imagem GIF tenha sido enviada, o mime será: "image/gif".
$_FILES['arquivo']['size']
- O tamanho em bytes do arquivo.
$_FILES['arquivo']['tmp_name']
- O nome temporário do arquivo, como está guardado no servidor.
$_FILES['arquivo']['error']
- O código de erro associado a este upload de arquivo. Essa opção foi adicionada na versão 4.2.0 do PHP.
Observações:
- Em versões anteriores do PHP a 4.1.0 use a variável $HTTP_POST_FILES e não a variável superglobal $_FILES que foi introduzida na versão 4.1.0;
- No lugar de 'arquivo' use o nome do seu campo "file" do formulário;
- Se a opção de configuração do PHP register_globals estiver como "on", você pode usar uma variável com o nome do campo de formulário, exemplo: $arquivo_name, $arquivo_size, etc. Mas, usar dessa maneira não é o recomendável, procure sempre usar a superglobal $_FILES.
O preferível no começo de "script.php" é passar a $_FILES para outra variável, por exemplo:
$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
$arquivo2 = isset($_FILES['arquivo2']) ? $_FILES['arquivo2'] : FALSE;
[... etc ...]
Os arquivos enviados pelo formulário serão guardados no diretório temporário do servidor, a menos que outro lugar seja especificado com a opção upload_tmp_dir no php.ini. E o caminho e nome de cada arquivo, são ditos na $_FILES['arquivo']['tmp_name'].
Para mover o arquivo para um diretório desejado deve-se usar a função move_uploaded_file() (em versões anteriores a 4.0.3 use a função copy).
Vamos então ao que interessa! O código de "script.php":
<?php // Repassa a variável do upload $arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE; // Caso a variável $arquivo contenha o valor FALSE, esse script foi acessado // diretamente, então mostra um alerta para o usuário if (!$arquivo) { echo "Não acesse esse arquivo diretamente!"; } // Imagem foi enviada, então a move para o diretório desejado else { // Diretório para onde o arquivo será movido $diretorio = "./arquivos/"; // Move o arquivo // Lembrando que se $arquivo não fosse declarado no começo do script, // você estaria usando $_FILES['arquivo']['tmp_name'] e $_FILES['arquivo']['name'] if (move_uploaded_file($arquivo['tmp_name'], $diretorio . $arquivo['name'])) { echo "Arquivo Enviado com sucesso!"; } else { echo "Erro ao enviar seu arquivo!"; } } ?>
Esse é o código mínimo que seu script de upload deve conter. Mas, o mesmo ainda não é seguro, pois não faz nenhuma verificação no arquivo, seja de tamanho, nome, tipo, etc. O próximo tópico aborda isso.
Bom eu estou com o seguinte problema eu to querendo pegar o arquivo que o usuario coloca e copiá-lo no servidor nao funciona e qndo eu vou entrar no tmp do para ver se tinha criado se quer um arquivo temporario tb nao criou?O que ta acontecendo?Alguem podia me dar um help please.
08/08/2007 8:48pm
(~17 anos atrás)
Cara, era o que eu precisava, porem eu preciso que dos dados do form seja cadastrado no mysql pq eh um controle de relatorios, e os pdfs vão pra uma pasta pro meu cliente acessar, e existem várias páginas, cada pdf pertence a uma pastas... meio complicado neh..
imagina assim... pdf1.pdf - pdf2.pdf - pdf3.pdf
pasta 1 - pdf2.pdf
pasta 2 - pdf1.pdf
pasta 3 - pdf3.pdf
ae qdo der o submit no form eu envio o pdf para pasta dele entendeu??
Tbm tem o casa de não ter a pasta e ela precisar ser criada...
ficou complexa a historia e ae eu parei...
Valeu desde já...
imagina assim... pdf1.pdf - pdf2.pdf - pdf3.pdf
pasta 1 - pdf2.pdf
pasta 2 - pdf1.pdf
pasta 3 - pdf3.pdf
ae qdo der o submit no form eu envio o pdf para pasta dele entendeu??
Tbm tem o casa de não ter a pasta e ela precisar ser criada...
ficou complexa a historia e ae eu parei...
Valeu desde já...
14/05/2007 12:34pm
(~17 anos atrás)
Uso o mysql aqui,,
MAnipulo o banco pelo myadmin
Como eu faria para guardar direto em um campo do meu banco de dados esse arquivo?
Qq coisa, desculpe-me a ignorância, sou novato no php.Um abraço a todos
MAnipulo o banco pelo myadmin
Como eu faria para guardar direto em um campo do meu banco de dados esse arquivo?
Qq coisa, desculpe-me a ignorância, sou novato no php.Um abraço a todos
05/04/2007 11:59pm
(~17 anos atrás)
O código funcionou perfeitamente no servidor windows, mas no servidor linux é preciso colocar a funcação CHMOD após de ter feito upload da imagem para o servidor para que você possa ter permissão de execução no arquivo.
chmod("/DIRETÓRIO/ARQUIVO",0777);
chmod("/DIRETÓRIO/ARQUIVO",0777);
11/10/2005 8:35am
(~19 anos atrás)
Eu conseguir configurar direitinho, o arquivos está sendo mandado para a pasta selecionada. Mas queria que vc postasse codigo php onde os arquivos envidos seriam mostrados automaticamente numa página.
Ex: o cara mandou um arquivos para a pasta Animes, aí o arquivo enviado seria mostrado na pagina Animes do meu site automaticamente, mostrando o nome, descrição, tamanho entre outros.
Pq tem q ficar adicionando um por um é um saco, queria um automatico, pelo amor de deus me ajudeeeeemmmm
Ex: o cara mandou um arquivos para a pasta Animes, aí o arquivo enviado seria mostrado na pagina Animes do meu site automaticamente, mostrando o nome, descrição, tamanho entre outros.
Pq tem q ficar adicionando um por um é um saco, queria um automatico, pelo amor de deus me ajudeeeeemmmm
20/06/2005 7:35pm
(~19 anos atrás)
Existe alguma forma de exibir o conteúdo do arquivo (foto ou conteúdo do texto) no script sem salvar no servidor????
14/04/2005 5:03pm
(~19 anos atrás)
Bom dia Alfred,
já realizo upload de arquivos, no entanto, pintou uma nova necessidade, a de realizar múltiplos uploads, no entanto, não quero selecionar arquivo a arquivo e sim um diretório inteiro. Vc saberia como posso fazer isso e, claro, se é possível.
de antemão, agradeço a atenção dispensada.
Att,
Luiz Lima
já realizo upload de arquivos, no entanto, pintou uma nova necessidade, a de realizar múltiplos uploads, no entanto, não quero selecionar arquivo a arquivo e sim um diretório inteiro. Vc saberia como posso fazer isso e, claro, se é possível.
de antemão, agradeço a atenção dispensada.
Att,
Luiz Lima
04/01/2005 6:32am
(~20 anos atrás)
Gastão,
Para upload não são usados nenhum módulo / extensão do PHP. É algo na engine do PHP. Que erro está obtendo?
Para upload não são usados nenhum módulo / extensão do PHP. É algo na engine do PHP. Que erro está obtendo?
21/12/2004 8:22am
(~20 anos atrás)
A questão é, se eu for acompanhar o seu formulario é claro que da certo.
Mais na realidade na pratica não está funcionado pois tenho uma pagina com as seguinte situação:
<form name="genericos" method="post" action="" enctype="multipart/form-data">
<label>
<span>Link PDF:</span>
<input type="text" name="link_pdf" />
</label>
<label>
<span>Upload do arquivo em PDF:</span>
<input type="file" name="up_pdf[]" class="file" />
</label>
<br /><br />
<label>
<span>Link Excel:</span>
<input type="text" name="link_excel" />
</label>
<label>
<span>Upload do arquivo em Excel:</span>
<input type="file" name="up_excel[]" class="file" />
</label>
<br /><br />
<label>
<span>Upload da Imagem Logo:</span>
<input type="file" name="up_logo[]" class="file" />
</label>
<input type="submit" name="salvar" id="salvar" value="Salvar" class="btn" />
</form>
Veja que tem 3 upload de imagem para fazer e 4 link sendo 2 em .pdf. e 2 em .xml.
Agora sou iniciante em programação então uma duvida.
Quanto vc sita "" $_FILES['arquivo'] "" a apalavra "arquivo" seria o que exatamente na minha situação, acredito que seria os ex: "" name="up_excel[]" "" ou não...
Como eu coloco esse script para fazer a minha pagina enviar uma imagem, 4 link, e 4 arquivos de documentos.
Obrigado por compartilhar.