Upload PHP files

Asked

Viewed 232 times

1

Good evening, I am currently creating a CRUD, where it will be necessary to upload a file. But I have the following problem:

Currently I can upload the file normally, placing it inside a folder in the application and saving the path in the database, displays in the list quietly, baby.

But when I edit, as much as I don’t change the image, the image still stops working.

If you are bad to view, follow the github link: https://github.com/rafaelmori123/TasksPHP

In case I change the image or do not change, error is this while accessing the file.

The requested resource /Resources/upload/ was not found on this server.

Follows the codes:

<?php require_once('cabecalho.php'); ?>
<?php require_once('carregaTask.php'); ?>
<div class="container">
  <form method="post" action="editaTask.php">
    <input type="hidden" name="codigo" value="<?=$task->getCodigo()?>">
    <h1>Formulario de Edição</h1>
    <table class="table table-striped table-hover">
      <tr>
        <td>
          Nome:
        </td>
        <td>
          <input type="text" name="nome" class="form-control" value="<?=$task->getNome()?>"/>
        </td>
      </tr>
      <tr>
        <td>
          Arquivo:
        </td>
        <td>

         Escolher Arquivo <input type="file" name="arquivo" value="<?=$task->getArquivo()?>"/>

        </td>
      </tr>
      <tr>
        <td>
          Descricao:
        </td>
        <td>
          <textarea name="descricao" class="form-control" rows="5"><?=$task->getDescricao()?></textarea>
        </td>
      </tr>
    </table>
    <div class="text-center">
      <button type="submit" class="btn btn-lg btn-primary">Confirmar Edição</button>
    </div>
  </form>
</div>

<?php require_once('rodape.php'); ?>

...

<?php


function upload(){

  // Pasta onde o arquivo vai ser salvo
  $_UP['pasta'] = 'Resources/upload/';
  // Tamanho máximo do arquivo (em Bytes)
  $_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb
  // Array com as extensões permitidas
  $_UP['renomeia'] = false;
  // 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:" . $_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 do tamanho do arquivo
  if ($_UP['tamanho'] < $_FILES['arquivo']['size']) {
    echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
    exit;
  }
  // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
  // 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
    $nome_final = md5(time()).'.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 '<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";
  }

  $path = $_UP['pasta'] . $nome_final;
  return $path;
}

?>

...

<?php require_once('../vendor/autoload.php'); ?>
<?php require_once('upload.php'); ?>
<?php
use App\Classes\Task as Task;

$arquivo = upload();
$task = new Task();
$task->setCodigo($_POST['codigo']);
$task->setNome($_POST['nome']);
$task->setDescricao($_POST['descricao']);
$task->setArquivo($arquivo);
print_r('<pre>');
print_r($task);
print_r('<pre>');
$task->update();
header('Location: GerenciarTasks.php');
die();

 ?>

...

  public function update(){
    $query = "UPDATE task SET nome = :nome, descricao = :descricao, arquivo = :arquivo
    WHERE codigo = :codigo";
    $conexao = Conexao::conn();
    $stm = $conexao->prepare($query);
    $stm->bindValue(':codigo',$this->codigo);
    $stm->bindValue(':nome',$this->nome);
    $stm->bindValue(':descricao',$this->descricao);
    $stm->bindValue(':arquivo',$this->arquivo);

    $stm->execute();
  }

3 answers

1

It may not be the problem, but it is missing the Multipart/form-data in the form

  • Yes, Multipart/form-data is missing

  • 1

    opa, thank you also friend, that was one of the problems yes

1

And also have to validate the request when editing, Oce takes the path of the photo in the database and compares it with the file in the folder (this will also serve to delete the old photo if you want to update it too). Once I tweet on the computer I can pass the idea.

  • Yes, he can also do a different method just for editing, it’s not the best practice, but, as it seems to be starting now, it sounds the most correct way for him to ascertain the whole functioning of the process, but it’s pretty simple too, only a passed flag on the $_POST would solve this for him.

0


Hello, I came through the group PHP Brazil Whastapp you posted, I’m William.

Let’s go to your aid.

Then by error what indicates is that the upload is not finding the folder, so first you have to check if the folder exists, because if the folder does not exist in the path you are specifying the upload class you are using is not creating it for you, you will soon have to do it manually.

I believe that if you do this check your file will work normally and also take into account the above answer of Flaviano Honorato, you can not forget the Multipart/form-data enctype if not yours $_FILES array will not be populated.

  • 1

    opa, thank you very much for the attention, a detail that I missed, but I followed your advice yes and did the checks also.

  • Did it work? If yes, mark as answer ai to help us in the stack score

Browser other questions tagged

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