Ir ao conteúdo
  • Cadastre-se

PHP Subir arquivo dando erro no php


Ir à solução Resolvido por DiF,

Posts recomendados

Estou com o seguinte script pra receber um file usando jquery. Estou tratando de dentro de um sistema moodle. Não cria o arquivo nem a pasta. Já olhei permissões e configurações do apache. 

 

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 'On');

if(isset($_FILES['file']['name'])){
      
      /* Getting file name */
      $filename = $_FILES['file']['name'];
      $temp = $_FILES['file']['tmp_name'];

      /* Location */
      $location = __DIR__."/".$filename;
      try {
            $status = move_uploaded_file($_FILES['file']['name'], $location);
            
      }
      catch(Exception $e){
            echo 'Caught exception: ',  $e->getMessage(), "\n";
            $status = 0;
      }
      
      $response = array();
      
      $response['path'] = $location;
      $response['filesarray'] = json_encode($_FILES);
      $response['path'] = $location;
      $response['extension'] = "pdf";
      $response['status'] = $status;
      $response['tmpfile'] = $temp;
      echo json_encode($response);
      
}
?>

 

Agora o JS: 

 

$(document).ready(function(){ 
           
    $("#fileinput1").on("change", function(e) {
        
        var fd = new FormData();
        fd.append("file",e.target.files[0]);
        

        $.ajax({
            type: "POST",
            url: "upload.php",
            dataType: 'json',
            data: fd,
            contentType: false,
            processData: false,
            cache: false,
            success: function(response){
                if(response.status == 1){
                    var extension = response.extension;
                    var path = response.path;
                    alert("show de bola!");
                    if(extension == 'pdf'){
                          $("#fileprev").attr("href",path);
                          $("#fileprev").show();
                    }else{
                          $("#erro").show();
                    }

               }else{
                    alert('Erro no upload'+response.status+ "path: "+ response.path +
                    "filearray: "+response.filesarray)+
                    "TMP: "+response.tmpfile;
               }                
            }
        });


    });        

});

O POST é enviado, e o retorno é sempre 0, da função move_uploaded_file(origemfile, destino). Sempre consegui fazer nas versões anteriores do PHP (7 pra baixo). Estou usando php 8, se alguém puder dar uma luz. 

 

Formulário que o JS pega: 

<!DOCTYPE html>
<html lang="pt-br">
<head><title>Teste upload</title></head>
<script type="text/javascript" src="jquery-3.7.0.min.js"></script>
<script type="text/javascript" src="module.js"></script>
<body>

<input type='file' name="file" id='fileinput1'>
<span class='button'>Selecione seu arquivo</span>
<a href="#" target="_blank" class="prevel" id="fileprev" style="display: none;">Visualizar</a>
<span id="erro" style="display: none;">Óia a cobra,é mentira!!!</span>

</body>
</html>

 

Muito obrigado desde já.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Fabricio Lisboa Franco Você não colocou o campo file dentro de um form, e nem definiu o form para enviar arquivos.

 

Tente desta forma:

 

<form id="upload-form" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="upload" />
</form>

 

No ajax,  a estrutura é antiga e obsoleta...  adapte para este formato:

  $(document).ready(function () {
  $("#upload-form").submit(function (event) {
    event.preventDefault();
    var formData = new FormData($(this)[0]);
    $.ajax({
      url: 'upload.php',
      type: 'POST',
      data: formData,
      async: false,
      cache: false,
      contentType: false,
      processData: false
     
    }).done(function(response){
        alert(response);  
    }).fail(function(response){
        alert(response);
    });
    return false;
  });
});

 

No caso, o  atributo sucess,   se tornou  uma função  chamada done()   e o else ali,  no caso se tornou uma função chamada fail().

 

No php....  teste assim:

 

<?php
if ($_FILES["file"]["error"] > 0) {
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
  } else {
    $file = $_FILES['file']['name'];
    $temp = $_FILES['file']['tmp_name'];
    $file_size = $_FILES['file']['size'];
    $file_type = $_FILES['file']['type'];
    $folder="uploads/";
  
  $resultado = array("arquivo enviado", "falhou");
  
  //testa se foi enviado o arquivo ou não.
  (move_uploaded_file($temp,$folder.$file)) ? $resultado[0] : $resultado[1] ;

 

Claro que dá para implentar mais coisas... como testar se o arquivo é um tipo aceito e etc.. o tamanho e etc...

inlcusive, assim que enviar o arquivo para a pasta destinada,  copiar o nome do arquivo e cadastrar no banco de dados.

Link para o comentário
Compartilhar em outros sites

@DiFeu fiz aqui rodou direitinho, agora só dando um erro de Filedoes nos exist. Veja como estão minha função php: 

 

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 'On');

if ($_FILES["file"]["error"] > 0) {
      $response = array();
      $response['error'] = "Error: " . $_FILES["file"]["error"] . "<br>";
      echo json_encode($response);
} else {
      $file = basename($_FILES['file']['name']);
      $temp = $_FILES['file']['tmp_name'];       
      $file_size = $_FILES['file']['size'];
      $file_type = $_FILES['file']['type'];
      
      $folder="uploads";
      $ext = array("pdf");
      $resultado = array("arquivo enviado", "falhou");
      $path = $folder.basename($_FILES['file']['name']);
      // enviando      
      $envia = (move_uploaded_file($temp, "$folder/$file")) ? $resultado[0] : $resultado[1] ;

      $response = array();
      
      $response['path'] = $folder;
      $response['filesarray'] = json_encode($_FILES);
      $response['path'] = "$folder/$file";
      $response['tmpfile'] = $temp;
      $response['resultado'] = $envia;
      echo json_encode($response);

}

 

Erro gerado mandei em anexo. Muito obrigado de novo. 

 

 

erroupload.png

Link para o comentário
Compartilhar em outros sites

  • Moderador
  • Solução

@Fabricio Lisboa Franco

Aqui nesse trecho me chamou a atenção:

 

  $folder="uploads";
      $ext = array("pdf");
      $resultado = array("arquivo enviado", "falhou");
      $path = $folder.basename($_FILES['file']['name']);
      // enviando      
      $envia = (move_uploaded_file($temp, "$folder/$file")) ? $resultado[0] : $resultado[1] ;

 

Na varialvel $folder,  você não colocou uma barra no final...

Repare que na função move_uploaded_file,  você colocou em string a pasta e o arquivo..  e a barra ali..   Talvez seja isso que a função esteja retornando erro de não encontrado.

 

Tente mudar para isto:

 $folder="uploads/";

// enviando      
$envia = (move_uploaded_file($temp, $path)) ? $resultado[0] : $resultado[1] ;

 

 

Ou desta forma:

$folder="uploads/";

// enviando      
$envia = (move_uploaded_file($temp, $folder.$file)) ? $resultado[0] : $resultado[1] ;

 

Se optar por esse segundo jeito,  remova a linha :

 

$path = $folder.basename($_FILES['file']['name']);

POis ela vai ser redundante e inútil.  Porque ela seria a mesclagem da pasta com o arquivo.

 

Se você não colocar uma barra no final de uploads na variavel $folder e  der um echo em $path,   provavelmente ela te retornaria:

 

uploadsArquivo.pdf ... porque você mesclou ambas variaveis.. e ela não possui barra.. fazendo com que o caminho fique errado e consequentemente não irá achar o arquivo..

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!