このチュートリアルでは、.zip、.pdf、.docx、.pptなどのさまざまな形式のファイルと、PHPを使用してサーバー上のフォルダーに保存するフォームを介して画像ファイルをアップロードする方法を示します。
また、アップロードされたファイルの名前と、ファイル名、サイズ、ダウンロード数などの関連情報をデータベーステーブルに記録します。
新しいPHPプロジェクトフォルダを作成し、file-upload-downloadという名前を付けます。このフォルダ内にuploads(アップロードされたファイルが保存される場所)というサブフォルダと、index.phpというファイルを作成します。
index.phpは、ファイルアップロードフォームを作成する場所です。それを開き、このコードをその中に入れます:
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>
これは、ファイルの入力フィールドとアップロードボタンだけを使用する非常に単純なフォームです。
ヘッドセクションでは、style.cssファイルにリンクして、フォームにスタイルを設定しています。アプリケーションのルートにそのファイルを作成し、この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;
}
index.phpの上部に、filesLogic.phpファイルが含まれています。これは、送信されたファイルを受信してアップロードフォルダに保存し、ファイル情報をデータベースに保存するためのすべてのロジックを含むファイルです。このファイルを今すぐ作成しましょう。
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.";
}
}
}
このファイルの先頭でデータベースに接続していますが、まだ作成していません。今それをしましょう。
ファイル管理と呼ばれる新しいデータベースを作成します。このデータベースの下に、filesというテーブルを作成し、次のフィールドを指定します。
- id-INT
- 名前-VARCHAR(255)
- サイズ-INT
- ダウンロード
次に、ブラウザでindex.phpファイルを開きます。私の場合は、http://localhost/file-upload-download/download.phpにアクセスします。
ファイル入力フィールドをクリックし、アップロードするマシンから任意のファイルを選択します。
注:phpの構成によっては、サイズがphp.iniファイルに設定されているupload_max_filesizeの値を超えると、ファイルのアップロードに失敗する場合があります。この情報は、php.iniファイルでいつでも構成できます。 post_max_sizeとupload_max_filesizeの値を増やします。
ファイルを選択したら、アップロードボタンをクリックできます。すべてがうまくいけば、ファイルはプロジェクトのアップロードフォルダにアップロードされ、ファイル名、サイズ、ダウンロード数を含む新しいレコードがデータベースのファイルテーブルに作成されます。
これでファイルがアップロードされました。アップロードフォルダとデータベーステーブルをチェックして、成功したことを確認できます。ユーザーが表示し、クリックしてダウンロードできるように表示してみましょう。まず、データベースからファイル情報を取得する必要があります。
filesLogic.phpを開き、データベースに接続する行のすぐ下に次の3行のコードを追加します。
<?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);
これにより、データベースからすべてのファイル情報が選択され、$filesという配列変数に設定されます。
次に、アプリケーションのルートフォルダーにdownloads.phpというファイルを作成し、その中に次のコードを追加します。
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>
このページでは、データベースのファイル情報が、KB単位のサイズとダウンロード数とともにそれぞれ一覧表示されています。各ファイルに対するダウンロードボタンもあります。現在残っているのは、アップロードフォルダからファイルを実際にダウンロードするコードです。すぐにコードを書いてみましょう。
filesLogic.phpを再度開き、ファイルの最後に次のコードを追加します。
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;
}
}
ファイルを一覧表示するとき、各ダウンロードボタン(またはダウンロードリンク)には、file_idというパラメータが付加されていました。したがって、ファイルのダウンロードリンクをクリックすると、そのファイルのIDがfilesLogic.phpページに送信され、ここで追加したこのコードによって取得されます。
次に、コードはfile_idパラメーターを使用してデータベースからその特定のファイル情報をフェッチし、ファイル情報を$fileという変数に格納します。 PHPのfile_exists()メソッドを使用して、ファイルへのフルパスを引数として使用し、ファイルが実際にアップロードフォルダに存在することを確認します。次に、いくつかのヘッダーの設定に進み、最後にPHPのreadFile()関数を使用してユーザーにファイルで応答します。
ファイルがダウンロードされた後、データベース内のその特定のファイルのダウンロード数を更新します。
結論
ファイルのアップロードとダウンロードについては以上です。さらにカスタマイズして、クールなPHPアプリケーションを構築できます。フォローしていただきありがとうございます。よろしければ、下のコメントセクションでこの記事についてどう思うか教えてください。
楽しい時間をお過ごしください!