Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como fazer upload e download de arquivos PHP e MySQL


Este tutorial demonstra como você pode fazer upload de arquivos de vários formatos, incluindo .zip, .pdf, .docx, .ppt, bem como arquivos de imagem através de um formulário usando PHP para serem armazenados em uma pasta em nosso servidor.

Também registraremos o nome dos arquivos carregados e informações relacionadas, como nome do arquivo, tamanho e número de downloads em uma tabela de banco de dados.

Crie uma nova pasta de projeto PHP e chame-a de arquivo-upload-download. Crie uma subpasta dentro dessa pasta chamada uploads (é onde nossos arquivos enviados serão armazenados) e um arquivo chamado index.php.

index.php é onde criaremos nosso formulário de upload de arquivo. Abra-o e coloque este código dentro dele:

index.php:
<?php include 'filesLogic.php';?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="style.css">
    <title>Files Upload and Download</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <form action="index.php" method="post" enctype="multipart/form-data" >
          <h3>Upload File</h3>
          <input type="file" name="myfile"> <br>
          <button type="submit" name="save">upload</button>
        </form>
      </div>
    </div>
  </body>
</html>

É um formulário muito simples que leva apenas o campo de entrada para o nosso arquivo e um botão de upload.

Na seção head, estamos vinculando nosso arquivo style.css para fornecer algum estilo ao nosso formulário. Crie esse arquivo na raiz do nosso aplicativo e adicione este código CSS a ele:

style.css:
form {
  width: 30%;
  margin: 100px auto;
  padding: 30px;
  border: 1px solid #555;
}
input {
  width: 100%;
  border: 1px solid #f1e1e1;
  display: block;
  padding: 5px 10px;
}
button {
  border: none;
  padding: 10px;
  border-radius: 5px;
}
table {
  width: 60%;
  border-collapse: collapse;
  margin: 100px auto;
}
th,
td {
  height: 50px;
  vertical-align: center;
  border: 1px solid black;
}





Na parte superior de index.php, incluímos o arquivo filesLogic.php. Este é o arquivo que contém toda a lógica de receber nosso arquivo enviado e salvá-lo na pasta de uploads, além de armazenar as informações do arquivo no banco de dados. Vamos criar este arquivo agora.

arquivosLogic.php:
<?php
// connect to the database
$conn = mysqli_connect('localhost', 'root', '', 'file-management');

// Uploads files
if (isset($_POST['save'])) { // if save button on the form is clicked
    // name of the uploaded file
    $filename = $_FILES['myfile']['name'];

    // destination of the file on the server
    $destination = 'uploads/' . $filename;

    // get the file extension
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // the physical file on a temporary uploads directory on the server
    $file = $_FILES['myfile']['tmp_name'];
    $size = $_FILES['myfile']['size'];

    if (!in_array($extension, ['zip', 'pdf', 'docx'])) {
        echo "You file extension must be .zip, .pdf or .docx";
    } elseif ($_FILES['myfile']['size'] > 1000000) { // file shouldn't be larger than 1Megabyte
        echo "File too large!";
    } else {
        // move the uploaded (temporary) file to the specified destination
        if (move_uploaded_file($file, $destination)) {
            $sql = "INSERT INTO files (name, size, downloads) VALUES ('$filename', $size, 0)";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            }
        } else {
            echo "Failed to upload file.";
        }
    }
}

Na parte superior deste arquivo, estamos nos conectando a um banco de dados, mas ainda não o criamos. Vamos fazer isso agora.

Crie um novo banco de dados chamado gerenciamento de arquivos. Nesse banco de dados, crie uma tabela chamada arquivos e forneça os campos a seguir.
  • id - INT
  • nome - VARCHAR(255) 
  • tamanho - INT
  • transferências

Agora abra o arquivo index.php no seu navegador. Para mim, vou para http://localhost/file-upload-download/download.php.

Clique no campo de entrada do arquivo e selecione qualquer arquivo da sua máquina para carregar.

Nota:Dependendo de sua configuração php, seu arquivo pode falhar ao carregar se o tamanho exceder o valor upload_max_filesize definido em seu arquivo php.ini. Você sempre pode configurar esta informação em seu arquivo php.ini. Aumente os valores de  post_max_size e upload_max_filesize .

Depois de selecionar seu arquivo, você pode clicar no botão de upload. Se tudo correr bem, seu arquivo será carregado para a pasta de uploads em seu projeto e um novo registro será criado na tabela de arquivos no banco de dados contendo o nome do arquivo, tamanho e contagem de downloads.

Agora nosso arquivo foi carregado. Você pode verificar sua pasta de uploads e a tabela de banco de dados para confirmar se foi bem-sucedida. Vamos exibi-lo para que o usuário possa visualizá-lo e clique nele para baixá-lo. Primeiro, precisamos buscar as informações do arquivo no banco de dados.

Abra filesLogic.php e adicione essas 3 linhas de código logo abaixo da linha onde nos conectamos ao banco de dados:
<?php
// connect to database
$conn = mysqli_connect('localhost', 'root', '', 'file-management');

$sql = "SELECT * FROM files";
$result = mysqli_query($conn, $sql);

$files = mysqli_fetch_all($result, MYSQLI_ASSOC);

Isso seleciona todas as informações de arquivos do banco de dados e as define como uma variável de matriz chamada $files.

Agora crie um arquivo chamado downloads.php na pasta raiz do nosso aplicativo e adicione este código dentro dele:

downloads.php:
<?php include 'filesLogic.php';?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <link rel="stylesheet" href="style.css">
  <title>Download files</title>
</head>
<body>

<table>
<thead>
    <th>ID</th>
    <th>Filename</th>
    <th>size (in mb)</th>
    <th>Downloads</th>
    <th>Action</th>
</thead>
<tbody>
  <?php foreach ($files as $file): ?>
    <tr>
      <td><?php echo $file['id']; ?></td>
      <td><?php echo $file['name']; ?></td>
      <td><?php echo floor($file['size'] / 1000) . ' KB'; ?></td>
      <td><?php echo $file['downloads']; ?></td>
      <td><a href="downloads.php?file_id=<?php echo $file['id'] ?>">Download</a></td>
    </tr>
  <?php endforeach;?>

</tbody>
</table>

</body>
</html>

Agora, nesta página, as informações dos arquivos do banco de dados são listadas cada uma com o tamanho em KB e o número de downloads. Há também um botão de download em cada arquivo. O que resta agora é o código que realmente baixa o arquivo da nossa pasta de uploads. Vamos escrever o código imediatamente.

Abra filesLogic.php novamente e adicione este código no final do arquivo:

arquivosLogic.php:

// Downloads files
if (isset($_GET['file_id'])) {
    $id = $_GET['file_id'];

    // fetch file to download from database
    $sql = "SELECT * FROM files WHERE id=$id";
    $result = mysqli_query($conn, $sql);

    $file = mysqli_fetch_assoc($result);
    $filepath = 'uploads/' . $file['name'];

    if (file_exists($filepath)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($filepath));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize('uploads/' . $file['name']));
        readfile('uploads/' . $file['name']);

        // Now update downloads count
        $newCount = $file['downloads'] + 1;
        $updateQuery = "UPDATE files SET downloads=$newCount WHERE id=$id";
        mysqli_query($conn, $updateQuery);
        exit;
    }

}

Quando estávamos listando os arquivos, cada botão de download (ou melhor, link de download) tinha um parâmetro chamado file_id anexado a ele. Então, quando você clica no link de download de um arquivo, o id desse arquivo é enviado para a página filesLogic.php e é capturado por este pedaço de código que acabamos de adicionar agora.

O código então busca essas informações de arquivo específicas do banco de dados usando o parâmetro file_id e armazena as informações do arquivo em uma variável chamada $file. Usando o método file_exists() do PHP com o caminho completo para nosso arquivo como argumento, verificamos se o arquivo realmente existe em nossa pasta de uploads. Em seguida, passamos a definir alguns cabeçalhos e, finalmente, respondemos com o arquivo ao usuário usando a função readFile() no PHP.

Após o download do arquivo, atualizamos a contagem de downloads desse arquivo específico no banco de dados.

Conclusão


Isso é tudo com upload e download de arquivos. Você pode personalizá-lo ainda mais para criar aplicativos PHP interessantes. Muito obrigado por seguir. Deixe-me saber o que você pensa sobre este artigo na seção de comentários abaixo, por favor.

Divirta-se!