Mysql
 sql >> Database >  >> RDS >> Mysql

Come caricare e scaricare file PHP e MySQL

Questo tutorial mostra come caricare file di vari formati tra cui .zip, .pdf, .docx, .ppt, nonché file di immagine tramite un modulo utilizzando PHP da archiviare in una cartella sul nostro server.

Registreremo anche il nome dei file caricati e le relative informazioni come il nome del file, la dimensione e il numero di download in una tabella del database.

Crea una nuova cartella del progetto PHP e chiamala file-upload-download. Crea una sottocartella all'interno di questa cartella chiamata caricamenti (è qui che verranno archiviati i nostri file caricati)  e un file chiamato index.php.

index.php è dove creeremo il nostro modulo di caricamento file. Aprilo e inserisci questo codice al suo interno:

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>

È un modulo molto semplice che prende solo il campo di input per il nostro file e un pulsante di caricamento.

Nella sezione head, ci colleghiamo al nostro file style.css per fornire uno stile al nostro modulo. Crea quel file nella radice della nostra applicazione e aggiungi questo codice CSS:

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;
}

Nella parte superiore di index.php, stiamo includendo il file filesLogic.php. Questo è il file che contiene tutta la logica per ricevere il nostro file inviato e salvarlo nella cartella dei caricamenti, oltre a memorizzare le informazioni sul file nel database. Creiamo questo file ora.

filesLogic.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.";
        }
    }
}

Nella parte superiore di questo file, ci stiamo connettendo a un database ma non l'abbiamo ancora creato. Facciamolo ora.

Crea un nuovo database chiamato file-management. In questo database, crea una tabella chiamata file e assegna i seguenti campi.

  • id - INT
  • nome - VARCHAR(255) 
  • dimensione - INT
  • download

Ora apri il file index.php nel tuo browser. Per quanto mi riguarda, andrò su http://localhost/file-upload-download/download.php.

Fare clic sul campo di input del file e selezionare qualsiasi file dalla macchina da caricare.

Nota:a seconda della configurazione di php, il caricamento del file potrebbe non riuscire se la dimensione supera il valore upload_max_filesize impostato nel file php.ini. Puoi sempre configurare queste informazioni nel tuo file php.ini. Aumenta i valori di post_max_size e upload_max_filesize .

Dopo aver selezionato il tuo file, puoi fare clic sul pulsante di caricamento. Se tutto va bene, il tuo file verrà caricato nella cartella dei caricamenti del tuo progetto e verrà creato un nuovo record nella tabella dei file nel database contenente il nome del file, la dimensione e il conteggio dei download.

Ora il nostro file è stato caricato. Puoi controllare la cartella dei caricamenti e la tabella del database per confermare che l'operazione è andata a buon fine. Mostriamolo in modo che l'utente possa visualizzarlo e fare clic su di esso per scaricarlo. Innanzitutto, dobbiamo recuperare le informazioni sul file dal database.

Apri filesLogic.php e aggiungi queste 3 righe di codice appena sotto la riga in cui ci colleghiamo al database:

<?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);

Questo seleziona tutte le informazioni sui file dal database e le imposta su una variabile array chiamata $files.

Ora crea un file chiamato downloads.php nella cartella principale della nostra applicazione e aggiungi questo codice al suo interno:

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>

Ora in questa pagina, le informazioni sui file del database sono elencate insieme alle dimensioni in KB e al numero di download. C'è anche un pulsante di download per ogni file. Ciò che rimane ora è il codice che scarica effettivamente il file dalla nostra cartella dei caricamenti. Scriviamo subito il codice.

Apri nuovamente filesLogic.php e aggiungi questo codice alla fine del file:

filesLogic.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 stavamo elencando i file, ogni pulsante di download (o meglio, link di download) aveva un parametro chiamato file_id allegato. Quindi, quando fai clic sul link per il download di un file, l'id di quel file viene inviato alla pagina filesLogic.php e viene catturato da questo pezzo di codice che abbiamo appena aggiunto ora.

Il codice quindi recupera le informazioni sul file dal database utilizzando il parametro file_id e quindi memorizza le informazioni sul file in una variabile denominata $file. Utilizzando il metodo file_exists() di PHP con il percorso completo del nostro file come argomento, controlliamo che il file esista effettivamente nella nostra cartella dei caricamenti. Quindi procediamo con l'impostazione di alcune intestazioni e infine rispondiamo con il file all'utente utilizzando la funzione readFile() in PHP.

Dopo aver scaricato il file, aggiorniamo il conteggio dei download per quel particolare file nel database.

Conclusione

Questo è tutto con il caricamento e il download di file. Puoi personalizzarlo ulteriormente per creare fantastiche applicazioni PHP. Grazie mille per aver seguito. Fammi sapere cosa ne pensi di questo articolo nella sezione commenti qui sotto, per favore.

Divertiti!