1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Upload e redimensionamento de imagem em PHP

Discussão em 'Programação' iniciada por Carlos Moreira, 25 de Junho de 2005. (Respostas: 15; Visualizações: 6504)

  1. Carlos Moreira

    Carlos Moreira Power Member

    Viva... estou a fazer um pekeno formulário, onde existe upload de imagens.

    Já consgui por a funcionar com um script manhoso que arranjei na net, mas queria implementar também a funcionalidade de redimensionar as imagens que faz upload.. já tentei alguns scripts e n consigo..

    Como não percebo muito de PHP, funciono à base de copy paste dos scripts, estou a ver-me a rasca...

    Aqui vai o código:

    Código:
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
    //Mmaximum file size. You may increase or decrease.
    $MAX_SIZE = 100000;
                                
    //Allowable file Mime Types. Add more mime types if you want
    $FILE_MIMES = array('image/jpeg','image/jpg','image/gif'
                       ,'image/png','application/msword');
    
    //Allowable file ext. names. you may add more extension names.            
    $FILE_EXTS  = array('.jpg','.png','.gif'); 
    
    //Allow file delete? no, if only allow upload only
    $DELETABLE  = true;                               
    
    
    //vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    //   Do not touch the below if you are not confident.
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    /************************************************************
     *     Setup variables
     ************************************************************/
    $site_name = $_SERVER['HTTP_HOST'];
    $url_dir = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
    $url_this =  "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
    
    
    
    
    $upload_dir = $_SESSION['MM_Username']."/";
    $upload_url = $url_dir."/".$_SESSION['MM_Username']."/";
    $message ="";
    
    /************************************************************
     *     Create Upload Directory
     ************************************************************/
    if (!is_dir( $_SESSION['MM_Username'])) {
      if (!mkdir($upload_dir))
      	die ("Falha na criação da pasta para upload");
      if (!chmod($upload_dir,0755))
      	die ("change permission to 755 failed.");
    }
    if ($REQUEST_METHOD == "POST")
    {
    /* REDIMENSIONAR*/
    
     
    
    $fotonome = "nome_small.jpg";
    $tipo = "jpeg";
    $funcao="imagecreatefrom".$tipo; // $tipo deve conter jpeg, gif ou png.
    $img = $funcao($_SESSION['MM_Username']."/".$_FILES['userfile']['name']); // $ficheiro deve conter o caminho para a foto original
    $width = imagesx($img);
    $height = imagesy($img);
    $imgsmall = ImageCreateTrueColor(250,200); // criar nova imagem sem nada e com as dimensões 250x200
    imagecopyresampled($imgsmall, $img, 0, 0, 0, 0, 250, 200, $width, $height); // na nova imagem colocar a imagem original reduzida
    imagejpeg($imgsmall, "$foto_nome", 90); // guardar a imagem
    
    	
    	/*FIM*/
    
    
    }
    
    
    
    
    if ($_REQUEST[del] && $DELETABLE)  {
      $resource = fopen("log.txt","a");
      fwrite($resource,date("Ymd h:i:s")."DELETE - $_SERVER[REMOTE_ADDR]"."$_REQUEST[del]\n");
      fclose($resource);
      
      if (strpos($_REQUEST[del],"/.")>0);                  //possible hacking
      else if (strpos($_REQUEST[del],"files/") === false); //possible hacking
      else if (substr($_REQUEST[del],0,6)=="files/") {
        unlink($_REQUEST[del]);
        print "<script>window.location.href='$url_this?message=deleted successfully'</script>";
      }
    }
    else if ($_FILES['userfile']) {
      $resource = fopen("log.txt","a");
      fwrite($resource,date("Ymd h:i:s")."UPLOAD - $_SERVER[REMOTE_ADDR]"
                .$_FILES['userfile']['name']." "
                .$_FILES['userfile']['type']."\n");
      fclose($resource);
    
    	$file_type = $_FILES['userfile']['type']; 
      $file_name = $_FILES['userfile']['name'];
      $file_ext = strtolower(substr($file_name,strrpos($file_name,".")));
    
      //File Size Check
      if ( $_FILES['userfile']['size'] > $MAX_SIZE) 
         $message = "Erro, O ficheiro tem mais do que 100Kb";
      //File Type/Extension Check
      else if (!in_array($file_ext, $FILE_EXTS) )
         $message = "Erro, $file_name não é permitido.";
      else
         $message = do_upload($upload_dir, $upload_url);
      
      print "<script> alert('$message'); </script>";
    }
    else if (!$_FILES['userfile']);
    else 
    	$message = "Erro, ficheiro inválido."; 
    	
    	
    
    function do_upload($upload_dir, $upload_url) {
    
    	$temp_name = $_FILES['userfile']['tmp_name'];
    	$file_name = $_FILES['userfile']['name']; 
      $file_name = str_replace("\\","",$file_name);
      $file_name = str_replace("'","",$file_name);
    	$file_path = $upload_dir.$file_name;
    
    
    	
    
    	//File Name Check
      if ( $file_name =="") { 
      	$message = "Erro, nome de ficheiro inválido.";
      	return $message;
      }
    
     $result  =  move_uploaded_file($temp_name, $file_path);
      if (!chmod($file_path,0755))
       	$message = "change permission to 755 failed.";
      else
        $message = ($result)?"Upload de $file_name bem sucedido " :
         	      "Erro no upload de ficheiro";
      return $message;
      print "<script> alert('$message'); </script>";
    }

    Sei que para meu primeiro post aqui no forum posso estar a pedir muito..

    mas toda a ajuda é benvinda.

    Obrigado.
     
  2. NoMercy

    NoMercy Power Member

  3. BraBo

    BraBo Banido

  4. NoMercy

    NoMercy Power Member

    :D :P não "pah", é só mesmo para te dar a hipótese de brilhares e mostrares os teus conhecimentos.
    Como tu é que costumas responder ás perguntas de php por aqui, ainda para mais sobre as capacidades de trabalhar com imagem, pensei que podesses dar umas dicas ao Carlos Moreira.
    Eu respondia-lhe se soubesse como se faz, mas como não estou muito por dentro disso não posso. :P
     
  5. BraBo

    BraBo Banido

    Tu podes fazer duas coisas quanto a redimensionamento de imagens:
    - redimencionar directamente o ficheiro que te enviam...
    - recriar a imagem como tamanho que tu achares mais conveniente...

    O form em HTML apenas te controla o tipo de ficheiro inserido (permitido) e o tamanho que ocupa em disco. Ele não te controla (que eu saiba) o tamanho de uma imagem em termos de resolução.
    Se apenas permitires certos tipos de ficheiro para upload, isso já te simplifica um pouco o trabalho (não muito) mas pelo menos permite-te poupar os recursos do servidor, ou seja, não precisas de validar o tipo de ficheiro do lado do servidor...

    Sendo imagem, podes usar uma função que te retorna informações sobre o ficheiro enviado chamada getimagesize();, que te retorna um array de 4 entradas contendo a largura, altura e tipo de imagem http://pt.php.net/manual/pt_BR/function.getimagesize.php. Apartir daqui, já tens as informações necessárias para trabalhar a imagem de origem.

    Em seguida pode criar uma imagem nova usando a função ImageCreateTrueColor($W, $H); que te retorna um objecto de imagem com o tamanho que tu defines http://pt.php.net/manual/pt_BR/function.imagecreatetruecolor.php, não uses o ImageCreate();, pois esta função não te retorna uma imagem com a qualidade de cores que necessitas para por exemplo uma fotografia.

    Agora só tens de seleccionar a área da imagem de origem que queres copiar para a imagem de destino. Para isso podes usar a ImageCopyResized(); http://pt.php.net/manual/pt_BR/function.imagecopyresized.php, que tens de inserir as coordenadas da imagem que queres copiar, e para que área queres que seja copiada. Tu tens de usar duas variáveis de imagem como parametros de entrada, por isso, convem que convertas a imagem de upload do formulário também para uma variável de imagem usando por exemplo o ImageCreateFromJpeg($imagem); http://pt.php.net/manual/pt_BR/function.imagecreatefromjpeg.php se for um JPEG, ou ImageCreateFromPNG($imagem); http://pt.php.net/manual/pt_BR/function.imagecreatefrompng.php se for um PNG, etc...

    No fim, guardas no disco a imagem final usando ImageJpeg($dir_destino); http://pt.php.net/manual/pt_BR/function.imagejpeg.php, caso queiras em JPEG... Se assim o quiseres, podes também especificar a qualidade do JPEG que queres que seja guardada no disco.

    Não te esqueças de limpar os recursos das variáveis de imagem usando o ImageDestroy(); http://pt.php.net/manual/pt_BR/function.imagedestroy.php, e limpar todas as variáveis que usaste unset(); http://pt.php.net/manual/pt_BR/function.unset.php
     
  6. Nazgulled

    Nazgulled Power Member

    o teu código esta bastante longo e tem muitos blocos de codigo k poderiam ser divididos por secções e asism torna-se complicado percebe-lo visto tu estares a falar especificamente de criar uma miniatura de uma imagem. e sem saber exactamente qual erro que estás obter, torna-se complicado ajudar-te...
     
  7. Carlos Moreira

    Carlos Moreira Power Member

    :)

    Gracias a todos pela ajuda.

    Através de um script diferente consegui fazer alguma coisa :)

    Agora surgem problemas muito estranhos:
    - no meu localhost funciona perfeitamente
    - no servidor dá um dakeles erros de headers marados.. (Cannot modify header information - headers already sent by..) mas faz tudo direito..
    - com o IE nem sequer funciona.. n junta o tipo de ficheiro à string imagecreatefrom..

    Qual poderá ser a razão destes erros?
    Ainda vou experimentar outras formas de o fazer..

    Obrigado desde já.
     
  8. nothing

    nothing Power Member

    esse erro do

    Código:
    (Cannot modify header information - headers already sent by..)
    
    pode ter várias causas:
    - informação da sessão não estar no inicio do ficheiro (o bloco <?php ?> sobre sessões tem de estar mesmo no início, não podes ter nem um espacinho antes senão dá-te este erro);
    - se estás a usar sessões, tens de usar o session_start() no início de cada página;

    entre outros.
     
  9. D X

    D X

    Este erro dáva-me quando chamava a função "header()" depois de já ter colocado informação para envio (tipicamente, depois de ter posto HTML no output, mas um espaço em branco antes de <?php chega para provocar o erro).

    Portanto, certifica-te de que, se estás a chamar esta função, não tens nenhum código HTML, print() ou echo() antes.
     
  10. Carlos Moreira

    Carlos Moreira Power Member

    O código é gerado pelo dreamweaver..

    Código:
    $insertGoTo = "aeditficheiro.php";
      if (isset($_SERVER['QUERY_STRING'])) {
        $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
        $insertGoTo .= $_SERVER['QUERY_STRING'];
      }
      header(sprintf("Location: %s", $insertGoTo));
    e aparece depois de uma série de código também criado pelo dreamweaver para inserir as informações do form na base de dados e uns scripts de upload e redimensionamento de imagem q acrescentei.

    Foi o codigo q eu acrescentei que está provocar este erro.. pois sem o codigo de upload e redimensionamento de imagem, tuo funciona na perfeição...

    Se bem entendo, o q este pedaço de código faz é redireccionar para outra pagina, caso tenham sido inseridos dados no formulario.. certo?

    Menus mal é q, para além deste erro as coisas até funcionam..

    excepto no IE, que estranhamente dá um erro, pois, pelo que percebi n está coorer correctamente este pedaço de codigo de redimensionamento da imagem:

    Código:
    $file_type= $_FILES['userfile']['type'] ;
    
    if ($file_type == "image/gif"){
      $file_tipo = "gif";
    } elseif ($file_type == "image/jpeg"){
      $file_tipo = "jpeg";
    }
     elseif ($file_type == "image/png"){
      $file_tipo = "png";
    }
     
      $func    = imagecreatefrom.$file_tipo;

    pois dá um erro dizendo qé n reconhece a função imagecreatefrom() , ou seja, n faz a junção das strings...
     
  11. BraBo

    BraBo Banido

    Só uma pergunta... Porquê complicar tanto??? Não é mais facil criar uma class com as 3 funções que vais usar (JPEG, GIF, PNG) para criar uma variável com a imagem?!??? Até podes mandar como parametro de entrada da inicialização do objecto o ficheiro do utilizador...

    Código:
    public class Img{
       private $img;
       private $type;
       private $JPGQualidade = 80;
    
       Img::Img($ficheiro){
    	  $Dados_Img = getimagesize($ficheiro);
    	   $type = $Dados_Img[2];
    	   switch ($type){
    		 case 1:
    			$img = CreateImageFromGif($ficheiro);
    			break;
    		 case 2:
     			$img = CreateImageFromJpeg($ficheiro);
     			break;
     		 case 3:
     			$img = CreateImageFromPng($ficheiro);
      			break;
    		 default:
    		    throw new Exception("Erro ao carregar a Imagem. O Tipo de imagem não suportado!"); 
    	   } 
       }
       public function fExibirImagemBrowser(){
    	  switch ($type){
     		 case 1:
    			ImageGif($img);
    			break;
     		 case 2:
      			ImageJpeg($img, "", $JPGQualidade);
      			break;
      		 case 3:
      			ImagePng($img);
       			break;
     	   }
       }
       public function fExportarImagemDir($dir){
    	  switch ($type){
      		 case 1:
     			ImageGif($img, $dir);
     			break;
      		 case 2:
       			ImageJpeg($img, $dir, $JPGQualidade);
       			break;
       		 case 3:
       			ImagePng($img, $dir);
        			break;
      	   }
       }
    }
    Eu já não mexo em Php faz algum tempo e fiz este código sem sequer conferir a sintaxe, portanto vê-a apenas como referência, e como sujestão...

    EDIT: As duas ultimas funções....
     
    Última edição: 7 de Julho de 2005
  12. Carlos Moreira

    Carlos Moreira Power Member

    Se tu não mexes em php há algum tempo.. eu estou pela primeira vez a utilizar php..

    ainda tenho alguma dificuldade..

    Obrigado pela ajuda, vou testar o codigo assim que possa.

    Gracias
     
  13. alph

    alph Power Member

    Não vi o tópico todo, mas no outro dia tropecei nisto. Penso que te interessará, curte o capítulo 20. ;)
     
  14. BraBo

    BraBo Banido

    Não sei se o construtor de classes em Php é assim... Olhando agora para o código que escrevi, parece-me muito C++, mas hoje de tarde ainda vejo com mais calma e escrevo-te uma class um pouco menos "Buggueira", ok?
     
  15. BraBo

    BraBo Banido

    O Php.net tem isso tudo, e como referencia acho que é o melhor. É bom quando para uma determinada técnologia se tem um site que tem todo o knowhow necessário agrupado, em vez de andar de site para site à procura de informação.
     
  16. Akira

    Akira Power Member


    uma das maneiras mais clássicas de resolver isto é ligar os buffers de output pois do momento em que salta o primeiro caractere.. lá se foi header...

    http://pt.php.net/manual/en/ref.outcontrol.php
     

Partilhar esta Página