Ir para conteúdo
Fórum Script Brasil
  • 0

[RESOLVIDO]Ajudem a remover o erro deste script.


jefponte

Pergunta

Tenho um script que serve para enviar um arquivo ao servidor. Ele apresenta um erro, também tem a desvantagem de não aceitar arquivos grandes.

Queria saber duas coisas:

1. Como faço pra que meu script funcione sem gerar mensagem de erro.

2. Qual alternativa ao php posso usar para que envie arquivos grandes para o servidor?

-----

Arquivo

dir/index.php

<!--
Só um form q envia para o proximo arquivo
-->
<p>Enviar arquivos.</p>
<form enctype="multipart/form-data" action="insertatualizar.php" method="post"><br>
Arquivo <input type="file" name="arquivo"><br>
<input type="submit" value="Enviar arquivo">
</form>
----- arquivo dir/insertatualizar.php
<?php


$arquivo = $_FILES['arquivo']['tmp_name']; 
 $tamanho = $_FILES['arquivo']['size'];
 $tipo    = $_FILES['arquivo']['type'];
 $nome  = $_FILES['arquivo']['name'];



// Pasta onde o arquivo vai ser salvo
$_UP['pasta'] = '../dir/';

// Tamanho máximo do arquivo (em Bytes)
$_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

// Array com as extensões permitidas
$_UP['extensoes'] = array('jpg', 'png', 'gif', 'pdf', 'doc', 'docx', 'odt', 'html', 'css', 'php', 'zip', 'mp3');

// Renomeia o arquivo? (Se true, o arquivo será salvo como .jpg e um nome único)
$_UP['renomeia'] = false;

// Array com os tipos de erros de upload do PHP
$_UP['erros'][0] = 'Não houve erro';
$_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
$_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
$_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
$_UP['erros'][4] = 'Não foi feito o upload do arquivo';

// Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro
if ($_FILES['arquivo']['error'] != 0) {
die("Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
exit; // Para a execução do script
}

// Caso script chegue a esse ponto, não houve erro com o upload e o PHP pode continuar


$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

if (array_search($extensao, $_UP['extensoes']) === false) {
echo "Por favor, envie arquivos com as seguintes extensões: jpg, png, doc, docx, pdf ou gif";
}

// Faz a verificação do tamanho do arquivo
else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
}

// O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
else {
// Primeiro verifica se deve trocar o nome do arquivo
if ($_UP['renomeia'] == true) {
// Cria um nome baseado no UNIX TIMESTAMP atual e com extensão .jpg
$nome_final = time().'.jpg';
} else {
// Mantém o nome original do arquivo
$nome_final =  $_FILES['arquivo']['name'];
}

// Depois verifica se é possível mover o arquivo para a pasta escolhida
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
// Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
echo "Upload efetuado com sucesso!";
echo '<br /><a href="' . $_UP['pasta'] . $nome_final . '">Clique aqui para acessar o arquivo</a>';




} else {
// Não foi possível fazer o upload, provavelmente a pasta está incorreta
echo "Não foi possível enviar o arquivo, tente novamente";

}

}

?>
O Script funcionou perfeitamente no meu servidor online da Bysites. Mas no servidor local q instalei, apache, apresentou o seguinte erro: Strict Standards: Only variables should be passed by reference in D:\web\dir\insertatualizar.php on line 39 A linha 39 é a linha:
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

Então, como posso fazer esse erro não existir?

Como posso enviar arquivos maiores, já q php só envia 20MB?

Desde já, agradeço a todos que leram o post.

Editado por jefponte
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Meu caro amigo, copiar código da net sem entender o próprio é muito feio e errado, mas vou te ajudar porque peguei o mesmo código e fui atras de resolver o problema no Google e consegui, é o seguinte a sua linha 39, esta correta, mas no local por algum motivo da aquele problema mesmo o único modo de contorna é o seguinte

$img_nome = $_FILES['img_arquivo']['name'];

$img_separador = explode('.',$img_nome);

$extensao = strtolower(end($img_separador));

espero ter ajudado, e pare de copia código na net e pedir ajudar para resolver sem entende-lo pelo menos :@@

Fico muito bravo, de desenvolvedores estudarem, e pessoas comum querer tudo na moleza

Tenho um script que serve para enviar um arquivo ao servidor. Ele apresenta um erro, também tem a desvantagem de não aceitar arquivos grandes.

Queria saber duas coisas:

1. Como faço pra que meu script funcione sem gerar mensagem de erro.

2. Qual alternativa ao php posso usar para que envie arquivos grandes para o servidor?

-----

Arquivo

dir/index.php

<!--
Só um form q envia para o proximo arquivo
-->
<p>Enviar arquivos.</p>
<form enctype="multipart/form-data" action="insertatualizar.php" method="post"><br>
Arquivo <input type="file" name="arquivo"><br>
<input type="submit" value="Enviar arquivo">
</form>
----- arquivo dir/insertatualizar.php
<?php


$arquivo = $_FILES['arquivo']['tmp_name']; 
 $tamanho = $_FILES['arquivo']['size'];
 $tipo    = $_FILES['arquivo']['type'];
 $nome  = $_FILES['arquivo']['name'];



// Pasta onde o arquivo vai ser salvo
$_UP['pasta'] = '../dir/';

// Tamanho máximo do arquivo (em Bytes)
$_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

// Array com as extensões permitidas
$_UP['extensoes'] = array('jpg', 'png', 'gif', 'pdf', 'doc', 'docx', 'odt', 'html', 'css', 'php', 'zip', 'mp3');

// Renomeia o arquivo? (Se true, o arquivo será salvo como .jpg e um nome único)
$_UP['renomeia'] = false;

// Array com os tipos de erros de upload do PHP
$_UP['erros'][0] = 'Não houve erro';
$_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
$_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
$_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
$_UP['erros'][4] = 'Não foi feito o upload do arquivo';

// Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro
if ($_FILES['arquivo']['error'] != 0) {
die("Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
exit; // Para a execução do script
}

// Caso script chegue a esse ponto, não houve erro com o upload e o PHP pode continuar


$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

if (array_search($extensao, $_UP['extensoes']) === false) {
echo "Por favor, envie arquivos com as seguintes extensões: jpg, png, doc, docx, pdf ou gif";
}

// Faz a verificação do tamanho do arquivo
else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
}

// O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
else {
// Primeiro verifica se deve trocar o nome do arquivo
if ($_UP['renomeia'] == true) {
// Cria um nome baseado no UNIX TIMESTAMP atual e com extensão .jpg
$nome_final = time().'.jpg';
} else {
// Mantém o nome original do arquivo
$nome_final =  $_FILES['arquivo']['name'];
}

// Depois verifica se é possível mover o arquivo para a pasta escolhida
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
// Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
echo "Upload efetuado com sucesso!";
echo '<br /><a href="' . $_UP['pasta'] . $nome_final . '">Clique aqui para acessar o arquivo</a>';




} else {
// Não foi possível fazer o upload, provavelmente a pasta está incorreta
echo "Não foi possível enviar o arquivo, tente novamente";

}

}

?>
O Script funcionou perfeitamente no meu servidor online da Bysites. Mas no servidor local q instalei, apache, apresentou o seguinte erro: Strict Standards: Only variables should be passed by reference in D:\web\dir\insertatualizar.php on line 39 A linha 39 é a linha:
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

Então, como posso fazer esse erro não existir?

Como posso enviar arquivos maiores, já q php só envia 20MB?

Desde já, agradeço a todos que leram o post.

Link para o comentário
Compartilhar em outros sites

  • 0

Wilson, como você pode ter tanta certeza que eu não entendi esse código?

É verdade que eu peguei em um blog e foi um dos melhores e uso bastante. É de um blog, mas o código está todo explicado. Só olhar pelos comentários do código mesmo. Mas, apesar disso, não compreendo essa parte de:

$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));

e também não compreendi a solução por você apresentada. Gostaria muito que me explicasse, pois sou leigo. Nunca fiz curso algum de php ou de programação. Tudo o que sei, aprendi com blogs. Agradeceria se também mandasse uma referência bibliográfica para que eu possa estudar o assunto.

No entanto, não acho feio pegar um código e usá-lo antes de entendê-lo. Se você sentiu raiva por causa dessa besteirinha, imagina quando souber que eu criei uma rede social inteira com códigos e mais códigos retirados de blogs e sites. A maioria não entendo, mas sei que funcionam e sei para que servem. Aos poucos estou compreendendo suas partes.

Está aqui o link: http://gcsufc.com.br/

Se existe alguma lei contra utilização de códigos disponibilizados gratuitamente sem o entendimento integral, pode me denunciar.

Mas de qualquer forma, agradeço por ter respondido ao meu tópico e agradeço a solução que você apresentou. Muitos códigos eu só entendo por completo depois de postar aqui e ver o que os outros tem a dizer sobre ele. Na verdade, tento entender e não tenho a quem recorrer, venho aqui. Já aprendi muitas coisas assim.

Aguardo sua resposta, espero que explique um pouco qual foi o erro do código e como aplico essa solução. Desculpe se estou sendo muito escorão e querendo tudo de bandeja. Essa não é minha intenção. Na verdade, não estou tendo tudo de bandeja, estou me esforçando pra entender e pra aprender a criar. Pode crê que no futuro serei um bom desenvolvedor.

^^

Editado por jefponte
Link para o comentário
Compartilhar em outros sites

  • 0

Wilson, agradeço por tentar me ajudar. Mas o código continuou gerando o mesmo erro que antes, mesmo depois de ter feito as mudanças que você sugeriu. Esses dias andei estudando e encontrei um livro muito legal. E pesquisei também, agora sei o que significa esse "end(explode...." e agora já posso dizer que entendo esse spript na sua íntegra.

//O objetivo desta linha é pegar o nome da extensão(jpg, pdf, odf, etc.) e deixar as letras minúsculas
    //Funcao explode pega uma string e transforma num vetor, seus elementos delimitados pelo separador, no caso '.'
    //end(explode) pega somente o ultimo elemento do array gerado, no caso seria o nome da extensao
    //funcao strtolower retorna uma string com todos os seus caracteres minusculos
$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
Mesmo antes ou depois da mudança que você sugeriu no código nenhum erro deveria ser apresentado, eu acho que é o meu server que não estava funcionando direito. Quando instalei o Apache/PHP/Mysql no meu computador(windows 7) eu não sabia nem por onde começar. Procurei em diversos blogs e instalei programa por programa e, com muita dificuldade, configurando tudo manualmente, instalei tudo. Posteriormente descobri que existia o wamp server que faz tudo sozinho pra você e instala corretamente. Quando executo o código todo no Wampache(apache no wamp server) o erro não aparece, mas quando fecho o wamp e abro o apache 2.2 que instalei antes o erro aparece em qualquer código que use o "end(explode..." veja o script que fiz para testar:
<?php 
$frutas = "beterraba, melancia, goiaba, carambola";
$arraydasfrutas = explode(',', $frutas);

$frutafinal = end(explode(',' , $frutas));

echo $arraydasfrutas['0']. '<br><br>'; //exibe beterraba
echo $frutafinal; //exibe carambola

?>

Resultado no Wampache:

beterraba

carambola

Resultado no Apache que eu usava no dia-a-dia:

Strict Standards: Only variables should be passed by reference in D:\web\aprender\index.php on line 6

beterraba

carambola

Objs: Tanto no wamp como no Apache que instalei a versão apache era 2.2 e o PHP era 5.3.5

Eu só posso concluir que eu fiz algo errado na hora de instalar o server, pois o wampache exibe o resultado sem erro.

É possível que outros problemas que postei no Script Brasil tenham sido originados por esse problema de server. Agradeço pela sua ajuda, Wilson. Marcarei o forum como resolvido, já que o problema era no Apache e eu já tenho no wamp funcionando corretamente.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...