cheires 0 Report post Posted April 13, 2012 Olá a todos, 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: HTML <input name="ficheiro" id="ficheiro" type="file"> PHP $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? Obrigado a todos Abraço -- Edit(brunoais): Identificação da linguagem das tags code Share this post Link to post Share on other sites
HappyHippyHippo 1,165 Report post Posted April 13, 2012 $path = "uploads/"; //directoria para onde serão copiadas as imagens $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 exemplo: $nome_ficheiro_destino = "ficheiro1"; $path = dirname(__FILE__)."/uploads/".$nome_ficheiro_destino; move_uploaded_file($_FILES['ficheiro']['tmp_name'], $path); -- Edit(brunoais): Identificação da linguagem das tags code Arranjar BBCode mal usado IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Share this post Link to post Share on other sites
cheires 0 Report post Posted April 13, 2012 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 exemplo: $nome_ficheiro_destino = "ficheiro1"; $path = dirname(__FILE__)."/uploads/".$nome_ficheiro_destino; move_uploaded_file($_FILES['ficheiro']['tmp_name'], $path); -- Edit(brunoais): Identificação da linguagem das tags code 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. Obrigado pelas sugestões Share this post Link to post Share on other sites
AndreLC 3 Report post Posted April 13, 2012 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."; Share this post Link to post Share on other sites
cheires 0 Report post Posted April 13, 2012 Um reparo, Ali na variável nomeficheiro e na função copy estás a buscar "fiheiro" em vez de "ficheiro". 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. Share this post Link to post Share on other sites
HappyHippyHippo 1,165 Report post Posted April 13, 2012 1º - Eu sei disso. O $_Files['ficheiro']['name'] dá-me o noe desse ficheiro; 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 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); 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 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; sim pode ser relativo, mas é relativo ao "current working directory" que pode ser alterado a qualquer momento tornando essa solução muito "volátil" 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. 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 ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Share this post Link to post Share on other sites
AndreLC 3 Report post Posted April 13, 2012 Um exemplo: 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 return $destination; } //saveUploadedFileToCurrentPHPFolder $whereIsTheSavedFile = saveUploadedFileToCurrentPHPFolder('ficheiro'); Que é o mesmo que o HappyHippyHippo fez ao teu código só que organizado em função. echo ($knowledge != $sharing) ? "Serves no purpose!" : "Thank you for your help. It was very precious."; Share this post Link to post Share on other sites
cheires 0 Report post Posted April 13, 2012 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 ... 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. Share this post Link to post Share on other sites
HappyHippyHippo 1,165 Report post Posted April 13, 2012 Um exemplo: 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 return $destination; } //saveUploadedFileToCurrentPHPFolder $whereIsTheSavedFile = saveUploadedFileToCurrentPHPFolder('ficheiro'); Que é o mesmo que o HappyHippyHippo fez ao teu código só que organizado em função. cuidado !!! tens o directório de destino um caminho absoluto : "/uploads/".$_FILES["ficheiro"]["name"] IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Share this post Link to post Share on other sites
cheires 0 Report post Posted April 13, 2012 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. Problema resolvido. Share this post Link to post Share on other sites