Form with enctype makes it impossible to read input text and image upload

Asked

Viewed 45 times

0

I was managing to upload files with my form containing only an input and file type. However, I came up with the need to make a category registration form that sends the category data to the database and the image to the server with the name being id. From there the problem arose, follow my code at the time:

<form method="POST" action="cadascatraiz.php" enctype="multipart/form-data">
  <div class="form-group">
    <div class="form-label-group">
      <input type="text" name="inputCatRaiz" id="inputCatRaiz" class="form-control" placeholder="Categoria Raiz" required="required" autofocus="autofocus">
      <label for="inputCatRaiz">Categoria Raiz</label>
    </div>
  </div>
    <br>
    <div class="form-group">
          <label>Arquivo:</label>
          <input type="file" name="arquivo" />
      </div>
  <input type="submit" class="btn btn-primary btn-block" value="Cadastrar">

<?php 
    include 'conexao.php';
    $categoria =  htmlspecialchars(addslashes($_POST['inputCatRaiz']));

    $sql = "INSERT INTO tb_categoria (categoria) VALUES ('$categoria') ";

    if($con->query($sql)===TRUE){
        //código de um repósitorio
         // Pasta onde o arquivo vai ser salvo
        $_UP['pasta'] = '../eu/categorias/';

        // Tamanho máximo do arquivo (em Bytes)
        $_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

        // Array com as extensões permitidas
        $_UP['extensoes'] = array('png', 'gif', 'svg');

        // Renomeia o arquivo? (Se true, o arquivo será salvo como .jpg e um nome único)
        $_UP['renomeia'] = TRUE;

        // Array com os tipos de erros de upload do PHP
        $_UP['erros'][0] = 'Não houve erro';
        $_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
        $_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
        $_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
        $_UP['erros'][4] = 'Não foi feito o upload do arquivo';

        // Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro
        if ($_FILES['arquivo']['error'] != 0) {
        die("Não foi possível fazer o upload, erro:<br />" . $_UP['erros'][$_FILES['arquivo']['error']]);
        exit; // Para a execução do script
        }

        // Caso script chegue a esse ponto, não houve erro com o upload e o PHP pode continuar

        // Faz a verificação da extensão do arquivo
        $extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
        if (array_search($extensao, $_UP['extensoes']) === false) {
        echo "Por favor, envie arquivos com as seguintes extensões: jpg, png ou gif";
        }

        // Faz a verificação do tamanho do arquivo
        else if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
        echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
        }

        // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
        else {
        // Primeiro verifica se deve trocar o nome do arquivo
        if ($_UP['renomeia'] == true) {
        // Cria um nome baseado no UNIX TIMESTAMP atual e com extensão .jpg

        $sql = "SELECT id FROM tb_categoria WHERE categoria = '$categoria'";
        $rolo = $con->query($sql)->fetch_assoc();
        $nome_final = rolo['id'].'.jpg';
        } else {
        // Mantém o nome original do arquivo
        $nome_final = $_FILES['arquivo']['name'];
        }

        // Depois verifica se é possível mover o arquivo para a pasta escolhida
        if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $_UP['pasta'] . $nome_final)) {
        // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
        echo "Upload efetuado com sucesso!";
        echo '<br /><a href="' . $_UP['pasta'] . $nome_final . '">Clique aqui para acessar o arquivo</a>';
        } else {
        // Não foi possível fazer o upload, provavelmente a pasta está incorreta
        echo "Não foi possível enviar o arquivo, tente novamente";
        }

        }
        $_SESSION['cadas_cat']='OK';
    }else{
        $_SESSION['cadas_cat']='ERRO';
    }
    $con->close();
    header("location:novacatraiz.php");
?>
  • What would be the problem presented?

  • In this case, when you only have the image input or only the text input they work correctly, but when the input of the two types of data are in the same form, only the database registration is performed...

  • Have you tried without this redirect at the end?

  • is only blank, did not display any of the messages, so I searched I believe it is this "enctype" problem in the form, but it allows you to upload the image...

  • So he’s not entering the first IF.

  • He enters the "if($con->query($sql)===TRUE){" and registers the category but the image does not go to the folder. This is what I can’t understand

  • How do you know you are entering the IF if it does not display any of the messages inside it?

  • By having the SESSION set inside this if, when it does the redirect to the page at the end I validate it and also check in the database...

  • At the end of the IF has another IF... ELSE each with a echo... I think if you were to enter this first IF, one of the two Echos should be shown. If the screen goes blank, leads me to insist that is not entering this IF. :/

  • I understand, I understand... I really don’t know what to do, because everywhere I saw talked about this enctype, you would have some idea how to get around it?

  • You have to make sure you are entering this IF. Put a echo 'entrou no if'; right at the beginning of this IF and comment on the redirect line. See if it shows this echo.

Show 6 more comments

1 answer

0


Mate, your code is correct... but do the following, I tested here at home, the situation you already recover the ID directly from the last INSERT of the current connection, hence you could remove some parts of the code, but analyze before removing something

As a solution do the following.

// Comente isto por enquanto...
// $sql = "SELECT id FROM tb_categoria WHERE categoria = '$categoria'";
// $rolo = $con->query($sql)->fetch_assoc();
/* $nome_final = rolo['id'] . '.jpg'; */
// Teste isso como solução...
$nome_final = mysqli_insert_id($con) . '.jpg';

The select part would be useless because you would already rescue the ID through the active connection.

  • Thank you very much, it worked perfectly!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.