Ir ao conteúdo

Posts recomendados

Postado

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á.

  • Moderador
Postado

@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.

Postado

@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

  • Moderador
  • Solução
Postado

@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..

 

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...