Upload de ficheiro [Resolvido] - PHP - Portugal-a-Programar
Upload de ficheiro [Resolvido]
By cheires, April 13, 2012 in PHP
cheires 0
Estou a tentar implementar, num backofice um upload de ficheiros para o servidor, nomeadamente de fotografias.
Mas não ,me está a copiar o ficheiro para a directoria pretendida.
tenho o seguinte código dentro de um form com method POST:
<input name="ficheiro" id="ficheiro" type="file">
$path = "uploads/"; //directoria para onde serão copiadas as imagens
$nomeficheiro = $_FILES['ficheiro']['name']; //para ir buscar o nome do ficheiro
copy($_FILES['ficheiro']['name'],$path); //copia o ficheiro para a directoria, ou pelo menos devia copiar
Apenas consigo ir buscar o nome do ficheiro através do NAME, e deveria ser através do TMP_NAME
Usei o $HTML_POST_FILE, e também não funciona;
Usei a função move_uploaded_file e também não funciona.
Onde posso estar a errar?
Edit(brunoais):
Identificação da linguagem das tags code
$nomeficheiro = $_FILES['fiheiro']['name']; //para ir buscar o nome do ficheiro
copy($_FILES['fiheiro']['name'],$path); //copia o ficheiro para a directoria, ou pelo menos devia copiar
1º - usa o move_uploaded_file porque o ficheiro encontrasse dentro de uma pasta de ficheiros temporários, logo nem sequer sabes onde se encontra, logo não tens o path do ficheiro temporário no servidor
2º - tens mesmo de usar o tmp_name porque o ficheiro temporário tem esse nome, caso contrário não é possivel saber que ficheiro a guardar
3º - estas a usar um caminho relativo para o local de gravação, aconselho a usar um absoluto e a verificares se o directório tem permissões de gravação
4º - não estás a dar o nome do ficheiro destino
$nome_ficheiro_destino = "ficheiro1";
$path = dirname(__FILE__)."/uploads/".$nome_ficheiro_destino;
move_uploaded_file($_FILES['ficheiro']['tmp_name'], $path);
Arranjar BBCode mal usado
1º - Eu sei disso. O $_Files['ficheiro']['name'] dá-me o noe desse ficheiro;
2 º - o TMP_NAME não me retorna nome nenhum, e o NAME retorna-me o nome do ficheiro que pretendo faze upload (bem sei que deveria obter esse nome pelo TMP_NAME);
3º - pode passar pelo caminho absoluto o problema, de facto ainda não testei isso, mas, como para fazer o import de ficheiros se pode utilizar o caminho relativo, também deveria ser o mesmo caso para gravar os ficheiros;
4º - não preciso de dar o nome do ficheiro de destino. Usando a função copy ou a função move_uploaded_files só pede o nome do ficheiro a gravar e onde gravar o ficheiro.
AndreLC 3
Um reparo,
Ali na variável nomeficheiro e na função copy estás a buscar "fiheiro" em vez de "ficheiro".
echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious.";
Obrigado pelo reparo, mas foi erro ao escrever, não fiz copy/paste.
Já agora o caminho absoluto também não resolveu o problema.
sim ... da-te o nome do ficheiro original, mas o nome do ficheiro temporário existente no servidor não é esse.
se não usares o tmp_name não existe nenhuma maneira do script php saber que ficheiro ir buscar da pool de ficheiros temporários
se o tmp_name não te retorna nenhum nome é porque provavelmente terás um erro de transmissão.
verifica o campo error para verificar essa situação : $_FILES['ficheiro']['error']
este valor deverá ser 0 para nenhum erro
sim pode ser relativo, mas é relativo ao "current working directory" que pode ser alterado a qualquer momento tornando essa solução muito "volátil"
já te disse para não usares o copy porque não sabes qual o path do ficheiro temporário no servidor !!!!
como o $_FILES['ficheiro']['tmp_name'] (ou o $_FILES['ficheiro']['name']) só te dá o nome do ficheiro, é a mesma coisa que tentares copiar um ficheiro existente no "current working directory" com esse nome (directório diferente do directório que guarda os ficheiros temporários) para o destino.
usa o move_uploaded_file, a função existe para resolver esse prblema e não inventes, irá dar sempre problema !!!!
a solução já te foi dita. se continuares a bater no ceguinho deixarei de responder a este post ...
function saveUploadedFileToCurrentPHPFolder (){
$origin=$_FILES["ficheiro"]['tmp_name'];     //patch absoluta do ficheiro na origem
$destination="/uploads/".$_FILES["ficheiro"]["name"];  //path relativa do ficheiro, no directório corrente
move_uploaded_file($origin, $destination); //move o ficheiro
} //saveUploadedFileToCurrentPHPFolder
$whereIsTheSavedFile = saveUploadedFileToCurrentPHPFolder('ficheiro');
Que é o mesmo que o HappyHippyHippo fez ao teu código só que organizado em função.
Amigo, ninguém aqui está a bater em ceguinho nenhum. Se não pretender ajudar, está no seu direito e vontade.
Apenas já tentei as soluções que apresentou e nenhuma funcionou, no meu caso.
Bem sei que como diz é a forma correcta de fazer as coisas, mas, como disse, no meu caso, não está a funcionar.
Agradeço as suas sugestões.
tens o directório de destino um caminho absoluto : "/uploads/".$_FILES["ficheiro"]["name"]
Bem, obrigado a todos pela ajuda.
Havia uma confusão com a directoria onde iria ser salvo o ficheiro, por isso não estava a funcionar.