Jump to content
RuiGomes

Função file upload

Recommended Posts

RuiGomes

Boas,

No projecto que estou a desenvolver, tenho todas as funções em functions.php e processo as forms em process.php.

Tenho uma form para upload de uma fotografia na página carregar.php. A form é processada em process.php, e corre o seguinte código:

if($_POST['type']=='carregar') {
carregarFoto($_FILES['file']);
}

Em functions.php:

function carregarFoto($file)
{
	if((!empty($file)) && ($file['error'] == 0)) {
	  //Check if the file is JPEG image and it's size is less than 350Kb
	  $filename = basename($file['name']);
	  $ext = substr($filename, strrpos($filename, '.') + 1);
	  if (($ext == "jpg") && ($file["type"] == "image/jpeg") && 
		($file["size"] < 350000)) {
		//Determine the path to which we want to save this file
		  $newname = dirname(__FILE__).'/upload/'.$filename;
		  //Check if the file with the same name is already exists on the server
		  if (!file_exists($newname)) {
			//Attempt to move the uploaded file to it's new place
			if ((move_uploaded_file($file['tmp_name'],$newname))) {
			   echo "It's done! The file has been saved as: ".$newname;
			} else {
			   echo "Error: A problem occurred during file upload!";
			}
		  } else {
			 echo "Error: File ".$file["name"]." already exists";
		  }
	  } else {
		 echo "Error: Only .jpg images under 350Kb are accepted for upload";
	  }
	} else {
	 echo "Error: No file uploaded";
	}
}

O problema é que não consigo ver o $file['name']. A informação não "passa" do process.php para o functions.php.

Share this post


Link to post
Share on other sites
ruimcosta

Propriedades do $_FILES:

	
$_FILES['file']['name'];
$_FILES['file']['tmp_name'];
$_FILES['file']['size'];
$_FILES['file']['type'];

Não esquecer que no <form>, tens de ter <form action="" method="post" enctype="multipart/form-data">


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
RuiGomes

Sim, estou a usar esse tipo de form:

<form enctype="multipart/form-data" action="process.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Escolhe uma fotografia: <input name="file" type="file" /><br />
<input type="hidden" name="type" value="carregar" />
<input type="submit" value="Enviar!" />
</form>

No process.php tenho carregarFoto($_FILES['file']), ou seja, se a função é carregarFoto($file), então $_FILES['file'] deveria ser igual a $file.

No entanto, isto não está a funcionar.

Share this post


Link to post
Share on other sites
ruimcosta

entao faz assim:

if($_POST['type']=='carregar') {
     carregarFoto('file');
}

e na função:

    // em  vez de:  $filename = basename($file['name']);

$filename = $_FILES[$file]['tmp_name'];


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
RuiGomes

Assim já detecta que é foi enviado um ficheiro, mas o $filename não funciona.

A função está assim:

function carregarFoto($file)
{
	if((!empty($file)) && ($file['error'] == 0)) {
	  //Check if the file is JPEG image and it's size is less than 350Kb
	  $filename = $_FILES[$file]['tmp_name'];
	  echo $filename;
	  $ext = substr($filename, strrpos($filename, '.') + 1);
	  if (($ext == "jpg") && ($_FILES[$file] == "image/jpeg") && 
		($_FILES[$file]["size"] < 10240000000)) {
		//Determine the path to which we want to save this file
		  $newname = dirname(__FILE__).'/upload/'.$filename;
		  //Check if the file with the same name is already exists on the server
		  if (!file_exists($newname)) {
			//Attempt to move the uploaded file to it's new place
			if ((move_uploaded_file($file['tmp_name'],$newname))) {
			   echo "It's done! The file has been saved as: ".$newname;
			} else {
			   echo "Error: A problem occurred during file upload!";
			}
		  } else {
			 echo "Error: File ".$file["name"]." already exists";
		  }
	  } else {
		 echo "Error: Only .jpg images under 350Kb are accepted for upload";
	  }
	} else {
	 echo "Error: No file uploaded";
	}
}

Antes dava "No file uploaded", agora dá "only jpg images under 350kb are accepted.".

Tentei fazer um echo $filename; e não faz output de nada.

Share this post


Link to post
Share on other sites
ruimcosta

Testado e aprovado:

<?php

if( $_SERVER["REQUEST_METHOD"] == "POST" ){
    
    
    
    function carregarFoto($file)
        {
            if((!empty($file)) && ($file['error'] == 0)) {
              //Check if the file is JPEG image and it's size is less than 350Kb
             	$fnome = $_FILES[$file]['name'];
            	$fext  = substr($fnome,-4);
            	$ftemp = $_FILES[$file]['tmp_name'];
            	$fsize = $_FILES[$file]['size'];
            	$fmime = $_FILES[$file]['type'];
                
                echo "nome: ".$fnome."<br />";
                echo "ext.: ".$fext."<br />";
                echo "nome temporário: ".$ftemp."<br />";
                echo "tamanho: ".$fsize."<br />";
                echo "mime-type: ".$fmime."<br />";
                
              exit;
              
              $ext = substr($filename, strrpos($filename, '.') + 1);
              if (($ext == "jpg") && ($_FILES[$file] == "image/jpeg") && 
                    ($_FILES[$file]["size"] < 10240000000)) {
                    //Determine the path to which we want to save this file
                      $newname = dirname(__FILE__).'/upload/'.$filename;
                      //Check if the file with the same name is already exists on the server
                      if (!file_exists($newname)) {
                            //Attempt to move the uploaded file to it's new place
                            if ((move_uploaded_file($file['tmp_name'],$newname))) {
                               echo "It's done! The file has been saved as: ".$newname;
                            } else {
                               echo "Error: A problem occurred during file upload!";
                            }
                      } else {
                             echo "Error: File ".$file["name"]." already exists";
                      }
              } else {
                     echo "Error: Only .jpg images under 350Kb are accepted for upload";
              }
            } else {
             echo "Error: No file uploaded";
            }
    }
        
        carregarFoto("minha_foto");
}
?>

<form action="up.php" method="POST" enctype="multipart/form-data">
Foto <input type="file" name="minha_foto" />

<input type="submit" value="Carregar" />
</form>


Abraços e beijinhos,Rui Costa

Share this post


Link to post
Share on other sites
bmiguel84

Ruigomes:

$filename = $_FILES[$file]['tmp_name'];

não seria

$filename = $_FILES['file']['tmp_name'];

?

Share this post


Link to post
Share on other sites
Cybernavigator

Não porque ele vai substituir a variável $file por "minha_foto".

O que faz com que seja genérico, ele só precisa de passar o nome do field que leva o ficheiro...


Melhores cumprimentos,João Lopes***Esta mensagem foi escrita ao abrigo do novo Acordo Ortográfico***

Share this post


Link to post
Share on other sites
bmiguel84

Cyber, eu tava a falar do código do Ruigomes, que entre o meu post e o teu foi editado...

De qualquer forma, não sei se é do meu servidor, mas o código do Rui Costa não me funciona sem alguns ajustes, nomeadamente:

$ext = substr($filename, strrpos($filename, '.') + 1);
// $filename não é declarado, vai dar um warning, e não se obtém a extensão
// acho que seria $fnome no lugar de $filename

Depois desta linha corrigida: "Error: Only .jpg images under 350Kb are accepted for upload"

Porquê?

if (($ext == "jpg") && ($_FILES[$file] == "image/jpeg") &&
                    ($_FILES[$file]["size"] < 10240000000)) {
/*
acho que será:
if (($ext == "jpg") && ($_FILES[$file]['type'] == "image/jpeg") &&
                    ($_FILES[$file]["size"] < 10240000000)) {
*/

Ok. A seguir:

Notice: Undefined variable: filename in C:\wamp\www\test.php on line 47

Error: File m already exists

Mais uma vez, a variável $filename.

// trocar
$newname = dirname(__FILE__).'/upload/'.$filename;
//por
$newname = dirname(__FILE__).'/upload/'.$fnome;

Seguinte: Error: A problem occurred during file upload!

if ((move_uploaded_file($file['tmp_name'],$newname))) {
// não podemos usar $file['tmp_name'], pois $file é apenas uma string, e não o ficheiro
// trocar para:
if (move_uploaded_file($_FILES[$file]['tmp_name'],$newname)) {

It's done! The file has been saved as: C:\wamp\www/upload/online_advertising.jpg

Dessa forma já funciona no meu localhost ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.