MySQLi এক্সটেনশনে ফাইল অপারেশন মূলত ডেটাবেসের সাথে সংযুক্ত ফাইল প্রক্রিয়া করতে ব্যবহৃত হয়। এটি ফাইল আপলোড, ডাউনলোড এবং ফাইলের ডেটাবেসে স্টোরিং বা রিট্রিভ করার জন্য ব্যবহার করা যায়। যেমন, আপনি MySQLi দিয়ে ফাইল ডেটাবেসে সংরক্ষণ করতে পারেন বা ফাইল সিস্টেম থেকে ডেটা ইনপুট ও আউটপুট পরিচালনা করতে পারেন।
ফাইল আপলোড এবং ডেটাবেসে স্টোর করা
MySQLi ব্যবহার করে ফাইল সিস্টেমে ফাইল আপলোড এবং সেই ফাইলের পাথ বা অন্যান্য তথ্য ডেটাবেসে সংরক্ষণ করা হয়। এখানে ফাইল আপলোডের জন্য HTML ফর্ম এবং PHP কোড দেখানো হয়েছে।
১. ফাইল আপলোড করার HTML ফর্ম
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
</body>
</html>
২. ফাইল আপলোড এবং ডেটাবেসে সংরক্ষণ করা (PHP)
<?php
// ডেটাবেসে সংযোগ স্থাপন করা
$mysqli = new mysqli("localhost", "username", "password", "database_name");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES["fileToUpload"])) {
// ফাইল আপলোড এবং তার পাথ সংগ্রহ করা
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// ফাইল টাইপ চেক করা (যেমন PDF, JPG, PNG)
if ($fileType != "jpg" && $fileType != "png" && $fileType != "jpeg" && $fileType != "gif") {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// যদি আপলোড ঠিক থাকে, ফাইলটি ডেটাবেসে ইনসার্ট করা
if ($uploadOk == 1 && move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
// ফাইল পাথ ডেটাবেসে ইনসার্ট করা
$stmt = $mysqli->prepare("INSERT INTO files (file_path) VALUES (?)");
$stmt->bind_param("s", $target_file);
$stmt->execute();
echo "The file ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded and path stored in database.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
// সংযোগ বন্ধ করা
$mysqli->close();
?>
ব্যাখ্যা:
- এখানে, HTML ফর্ম ব্যবহার করে ফাইল আপলোড করা হয়। ব্যবহারকারী fileToUpload ইনপুট ফিল্ডের মাধ্যমে ফাইল নির্বাচন করেন।
- ফাইলের পাথ move_uploaded_file() ফাংশন দ্বারা আপলোড করা হয় এবং পরে ডেটাবেসে ইনসার্ট করা হয়।
ফাইল রিট্রিভ করা এবং ডাউনলোড করা
ফাইল ডেটাবেসে সংরক্ষণ করার পর, আপনি MySQLi দিয়ে সেই ফাইলটি পুনরুদ্ধার (retrieve) করে ব্যবহারকারীর কাছে ডাউনলোড করতে পারেন।
১. ফাইল ডাউনলোড করার PHP স্ক্রিপ্ট
<?php
// ডেটাবেসে সংযোগ স্থাপন করা
$mysqli = new mysqli("localhost", "username", "password", "database_name");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
// ফাইলের আইডি চেক করা
if (isset($_GET['id'])) {
$file_id = $_GET['id'];
// ডেটাবেস থেকে ফাইল পাথ রিট্রিভ করা
$sql = "SELECT file_path FROM files WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $file_id);
$stmt->execute();
$stmt->bind_result($file_path);
$stmt->fetch();
if ($file_path) {
// ফাইল পাঠানো শুরু
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
header('Content-Length: ' . filesize($file_path));
readfile($file_path);
exit;
} else {
echo "File not found.";
}
}
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
// সংযোগ বন্ধ করা
$mysqli->close();
?>
ব্যাখ্যা:
- এখানে
$_GET['id']দিয়ে ইউজার থেকে ফাইল আইডি নেওয়া হচ্ছে, যাতে সেই ফাইলটি ডেটাবেস থেকে রিট্রিভ করা যায়। - ফাইল পাথ রিট্রিভ করার পর
readfile()ফাংশন দ্বারা ফাইলটি ডাউনলোড করা হয়।
ফাইল ডেটা স্টোর এবং রিট্রিভ করার জন্য Blob ব্যবহার
MySQLi এর মাধ্যমে আপনি বাইনারি ফাইল ডেটা (যেমন ইমেজ, ভিডিও) Blob (Binary Large Object) ফরম্যাটে স্টোর এবং রিট্রিভ করতে পারেন।
১. Blob ডেটা ইনসার্ট করা (ফাইল স্টোর)
<?php
// ডেটাবেসে সংযোগ স্থাপন করা
$mysqli = new mysqli("localhost", "username", "password", "database_name");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
// ফাইল ইনপুট নেওয়া
$file = fopen($_FILES['fileToUpload']['tmp_name'], 'rb');
$file_data = fread($file, filesize($_FILES['fileToUpload']['tmp_name']));
fclose($file);
// Blob ডেটা ইনসার্ট করা
$stmt = $mysqli->prepare("INSERT INTO files (file_data) VALUES (?)");
$stmt->bind_param("b", $file_data);
$stmt->execute();
echo "File uploaded successfully.";
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
// সংযোগ বন্ধ করা
$mysqli->close();
?>
২. Blob ডেটা রিট্রিভ করা (ফাইল ডাউনলোড)
<?php
// ডেটাবেসে সংযোগ স্থাপন করা
$mysqli = new mysqli("localhost", "username", "password", "database_name");
if ($mysqli->connect_error) {
die("Connection failed: " . $mysqli->connect_error);
}
// ফাইলের আইডি চেক করা
if (isset($_GET['id'])) {
$file_id = $_GET['id'];
// ডেটাবেস থেকে Blob ফাইল রিট্রিভ করা
$sql = "SELECT file_data FROM files WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("i", $file_id);
$stmt->execute();
$stmt->bind_result($file_data);
$stmt->fetch();
// ফাইল পাঠানো শুরু
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="file"');
echo $file_data;
exit;
}
// স্টেটমেন্ট বন্ধ করা
$stmt->close();
// সংযোগ বন্ধ করা
$mysqli->close();
?>
সারাংশ
MySQLi এর মাধ্যমে ফাইল অপারেশন পরিচালনা করার জন্য, ফাইল আপলোড, স্টোর এবং ডাউনলোড করার জন্য PHP স্ক্রিপ্ট ব্যবহার করা হয়। ফাইল পাথ ডেটাবেসে সংরক্ষণ করা হয় এবং সেই পাথ বা ফাইল ডেটা ডেটাবেস থেকে রিট্রিভ করে ডাউনলোড করা হয়। Blob ডেটা স্টোর এবং রিট্রিভের মাধ্যমে বাইনারি ফাইলগুলো ডেটাবেসে সংরক্ষিত হতে পারে।
BLOB (Binary Large Object) হলো একটি ডেটা টাইপ যা খুব বড় বাইনারি ডেটা যেমন ইমেজ, অডিও, ভিডিও, অথবা অন্য কোনো বাইনারি ফাইল সংরক্ষণ করতে ব্যবহৃত হয়। MySQL তে BLOB ডেটা টাইপটি TINYBLOB, BLOB, MEDIUMBLOB, এবং LONGBLOB নামে বিভক্ত করা হয়েছে, যা বিভিন্ন আকারের বাইনারি ডেটা ধারণ করতে সক্ষম।
MySQLi ব্যবহার করে BLOB ডেটা ইনসার্ট, আপডেট, রিড, এবং ডিলিট করা সম্ভব। PHP এ BLOB হ্যান্ডলিং করতে mysqli এক্সটেনশন ব্যবহার করা হয়।
1. BLOB এর ধরন
MySQL তে BLOB এর প্রধান ধরনগুলো হলো:
- TINYBLOB: 255 বাইট পর্যন্ত বাইনারি ডেটা।
- BLOB: 65,535 বাইট (64 KB) পর্যন্ত বাইনারি ডেটা।
- MEDIUMBLOB: 16,777,215 বাইট (16 MB) পর্যন্ত বাইনারি ডেটা।
- LONGBLOB: 4,294,967,295 বাইট (4 GB) পর্যন্ত বাইনারি ডেটা।
2. BLOB ডেটা ইনসার্ট করা
BLOB ডেটা ইনসার্ট করার জন্য, সাধারণত Prepared Statements ব্যবহার করা হয়, যাতে ডেটা সুরক্ষিতভাবে ডাটাবেসে ইনসার্ট করা যায়।
উদাহরণ:
ধরা যাক, আমাদের একটি টেবিল রয়েছে যার মধ্যে একটি BLOB কলাম আছে এবং আমরা একটি ইমেজ ফাইল ডাটাবেসে ইনসার্ট করতে চাই।
<?php
// MySQLi দিয়ে সংযোগ তৈরি
$conn = mysqli_connect("localhost", "root", "", "test_db");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// ফাইল পাথ
$file = 'path_to_image.jpg';
// ফাইল কনটেন্ট পড়া
$fileContent = file_get_contents($file);
// Prepared statement ব্যবহার করে BLOB ডেটা ইনসার্ট করা
$stmt = $conn->prepare("INSERT INTO images (image_data) VALUES (?)");
$stmt->bind_param("s", $fileContent); // 's' মানে স্ট্রিং, কিন্তু এখানে বাইনারি ডেটা তাই এটি স্টোর করার জন্য 's' ব্যবহার করা হয়েছে।
$stmt->execute();
if ($stmt->affected_rows > 0) {
echo "Image inserted successfully!";
} else {
echo "Error inserting image!";
}
$stmt->close();
mysqli_close($conn);
?>
ব্যাখ্যা:
- file_get_contents() ফাংশন ব্যবহার করে ইমেজ ফাইলের বাইনারি ডেটা পড়া হচ্ছে।
- bind_param() ফাংশন ব্যবহার করে বাইনারি ডেটাকে Prepared Statement এর মধ্যে সন্নিবেশ করা হচ্ছে। এখানে
's'প্যারামিটার টাইপ ব্যবহৃত হচ্ছে, যা স্ট্রিং হিসাবে বাইনারি ডেটা পাঠাতে সক্ষম। - এরপর execute() ফাংশনটি ব্যবহার করে ডেটা ডাটাবেসে ইনসার্ট করা হচ্ছে।
3. BLOB ডেটা রিড করা (Select Operation)
BLOB ডেটা রিড করতে, mysqli_fetch_assoc() অথবা mysqli_fetch_array() ফাংশন ব্যবহার করা হয়। এটি ডাটাবেস থেকে BLOB ডেটাকে PHP ভেরিয়েবলে নিয়ে আসে এবং সেখান থেকে এটি প্রোসেস করা যেতে পারে।
উদাহরণ:
<?php
// MySQLi দিয়ে সংযোগ তৈরি
$conn = mysqli_connect("localhost", "root", "", "test_db");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// BLOB ডেটা রিড করা
$sql = "SELECT image_data FROM images WHERE id = 1";
$result = mysqli_query($conn, $sql);
if ($row = mysqli_fetch_assoc($result)) {
// BLOB ডেটা এক্সট্র্যাক্ট করা
$imageData = $row['image_data'];
// ইমেজ হেডার সেট করা
header("Content-type: image/jpeg");
echo $imageData;
} else {
echo "No image found!";
}
mysqli_close($conn);
?>
ব্যাখ্যা:
- SELECT স্টেটমেন্ট দিয়ে ডাটাবেস থেকে BLOB ডেটা (এখানে একটি ইমেজ) সংগ্রহ করা হচ্ছে।
- mysqli_fetch_assoc() ফাংশন ব্যবহার করে সেই ডেটাকে
$rowঅ্যারেতে সন্নিবেশ করা হচ্ছে। - header() ফাংশন ব্যবহার করে ইমেজটির কনটেন্ট টাইপ নির্ধারণ করা হচ্ছে, যাতে ব্রাউজারে সঠিকভাবে ইমেজটি প্রদর্শিত হয়।
- অবশেষে, echo করে ইমেজটি ব্রাউজারে প্রিন্ট করা হচ্ছে।
4. BLOB ডেটা আপডেট করা
BLOB ডেটা আপডেট করার সময়, একইভাবে Prepared Statements ব্যবহার করা হয়। আপনি যদি একটি বিদ্যমান BLOB ডেটা আপডেট করতে চান, তাহলে UPDATE SQL স্টেটমেন্ট ব্যবহার করবেন।
উদাহরণ:
<?php
// MySQLi দিয়ে সংযোগ তৈরি
$conn = mysqli_connect("localhost", "root", "", "test_db");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// ফাইল পাথ
$file = 'path_to_new_image.jpg';
// নতুন ফাইল কনটেন্ট পড়া
$fileContent = file_get_contents($file);
// Prepared statement ব্যবহার করে BLOB ডেটা আপডেট করা
$stmt = $conn->prepare("UPDATE images SET image_data = ? WHERE id = ?");
$stmt->bind_param("si", $fileContent, $id);
$id = 1; // এখানে id দিয়ে নির্দিষ্ট ইমেজ আপডেট করা হচ্ছে
$stmt->execute();
if ($stmt->affected_rows > 0) {
echo "Image updated successfully!";
} else {
echo "Error updating image!";
}
$stmt->close();
mysqli_close($conn);
?>
ব্যাখ্যা:
- নতুন ফাইলের বাইনারি ডেটা পড়া হচ্ছে এবং UPDATE স্টেটমেন্টের মাধ্যমে ডাটাবেসে আপডেট করা হচ্ছে।
- bind_param() ফাংশন ব্যবহার করে বাইনারি ডেটা এবং id প্যারামিটার একসাথে পাঠানো হচ্ছে।
5. BLOB ডেটা ডিলিট করা
BLOB ডেটা ডিলিট করার জন্য সাধারণত DELETE SQL স্টেটমেন্ট ব্যবহার করা হয়।
উদাহরণ:
<?php
// MySQLi দিয়ে সংযোগ তৈরি
$conn = mysqli_connect("localhost", "root", "", "test_db");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// BLOB ডেটা ডিলিট করা
$sql = "DELETE FROM images WHERE id = 1";
if (mysqli_query($conn, $sql)) {
echo "Image deleted successfully!";
} else {
echo "Error deleting image: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
ব্যাখ্যা:
- DELETE স্টেটমেন্টের মাধ্যমে নির্দিষ্ট id এর BLOB ডেটা ডিলিট করা হচ্ছে।
MySQLi ব্যবহার করে BLOB (Binary Large Objects) হ্যান্ডলিং খুবই সহজ, যেখানে Prepared Statements এবং mysqli_query() এর মাধ্যমে BLOB ডেটা ইনসার্ট, রিড, আপডেট এবং ডিলিট করা যায়। ইমেজ, অডিও, ভিডিও, বা অন্য কোনো বাইনারি ফাইল ডেটাবেসে সুরক্ষিতভাবে সংরক্ষণ এবং পরিচালনা করার জন্য এটি একটি শক্তিশালী পদ্ধতি।
ফাইল আপলোড এবং MySQLi ব্যবহার করে সেই ফাইল সংরক্ষণ একটি সাধারণ এবং গুরুত্বপূর্ণ টাস্ক যা ওয়েব অ্যাপ্লিকেশনে প্রায়ই ব্যবহৃত হয়। ফাইল আপলোড করার সময় সঠিক ফরম্যাট যাচাই, নিরাপত্তা নিশ্চিতকরণ এবং ডাটাবেসে সেই ফাইলের তথ্য সংরক্ষণ করার প্রক্রিয়াটি সঠিকভাবে পরিচালনা করা জরুরি।
এখানে ফাইল আপলোড এবং MySQLi দিয়ে সংরক্ষণের সম্পূর্ণ প্রক্রিয়া দেখানো হলো।
1. ফাইল আপলোড ফর্ম তৈরি করা
প্রথমে, একটি HTML ফর্ম তৈরি করতে হবে যেখানে ব্যবহারকারী ফাইল নির্বাচন করবে। এই ফর্মটি POST পদ্ধতিতে ফাইলটি সার্ভারে পাঠাবে।
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Upload</title>
</head>
<body>
<h2>Upload a File</h2>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">Choose file:</label>
<input type="file" name="file" id="file" required>
<button type="submit" name="submit">Upload</button>
</form>
</body>
</html>
এখানে:
- enctype="multipart/form-data": এটি ফর্মে ফাইল আপলোড করার জন্য প্রয়োজনীয় এনকোডিং।
- ফাইল ইনপুটে ব্যবহারকারী একটি ফাইল নির্বাচন করবে এবং সেই ফাইলটি upload.php ফাইলে পাঠানো হবে।
2. ফাইল আপলোড করার প্রক্রিয়া (upload.php)
এখন, upload.php ফাইলে PHP কোড লিখে ফাইলটি সার্ভারে আপলোড করতে হবে এবং তারপরে ফাইলের তথ্য MySQLi ডাটাবেসে সংরক্ষণ করতে হবে।
<?php
$host = "localhost"; // Database host
$user = "root"; // Database username
$password = ""; // Database password
$dbname = "test"; // Database name
// MySQLi connection
$conn = new mysqli($host, $user, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Check if form is submitted
if (isset($_POST['submit'])) {
// File information
$file = $_FILES['file'];
$file_name = $file['name'];
$file_tmp = $file['tmp_name'];
$file_size = $file['size'];
$file_error = $file['error'];
// Get file extension
$file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
// Allowed file types
$allowed = array('jpg', 'jpeg', 'png', 'gif', 'pdf');
// Check if the file type is allowed
if (in_array($file_ext, $allowed)) {
// Check if there was an error during upload
if ($file_error === 0) {
// Check file size (max 5MB)
if ($file_size <= 5000000) {
// Generate unique file name to avoid conflicts
$file_new_name = uniqid('', true) . '.' . $file_ext;
$file_destination = 'uploads/' . $file_new_name;
// Move the file to the target folder
if (move_uploaded_file($file_tmp, $file_destination)) {
// Insert file information into the database
$stmt = $conn->prepare("INSERT INTO files (file_name, file_path) VALUES (?, ?)");
$stmt->bind_param("ss", $file_new_name, $file_destination);
if ($stmt->execute()) {
echo "File uploaded and saved to database successfully!";
} else {
echo "Error inserting file information into the database.";
}
$stmt->close();
} else {
echo "Error uploading the file.";
}
} else {
echo "File is too large. Maximum size is 5MB.";
}
} else {
echo "There was an error during file upload.";
}
} else {
echo "Invalid file type. Only JPG, JPEG, PNG, GIF, and PDF are allowed.";
}
}
$conn->close();
?>
কোড ব্যাখ্যা:
- $_FILES['file']: এটি ফাইলের সমস্ত তথ্য ধারণ করে, যেমন নাম, টাইপ, সাইজ, এবং তtemporary অবস্থান।
- Allowed File Types: ফাইলের এক্সটেনশন চেক করে নিশ্চিত করা হয় যে, আপলোডযোগ্য ফাইল টাইপ কেবলমাত্র অনুমোদিত ধরনের (যেমন, JPG, PNG, PDF ইত্যাদি)।
- File Size Check: ফাইলের আকার চেক করা হয় যাতে এটি নির্ধারিত সীমানার মধ্যে থাকে (এখানে 5MB)।
- Unique File Name: ফাইলের নামটি ইউনিক করা হয় যাতে একাধিক ফাইল একসাথে আপলোড করার সময় কনফ্লিক্ট না হয়।
- Move Uploaded File: move_uploaded_file() ফাংশনটি ফাইলটিকে নির্দিষ্ট গন্তব্যে স্থানান্তর করে।
- Database Insert: ফাইলের নাম এবং অবস্থান (path) MySQLi ব্যবহার করে ডাটাবেসে সংরক্ষণ করা হয়।
3. ডাটাবেসে টেবিল তৈরি করা
ফাইল সম্পর্কিত তথ্য সংরক্ষণের জন্য একটি টেবিল তৈরি করতে হবে। উদাহরণস্বরূপ:
CREATE TABLE files (
id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(255) NOT NULL,
upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
এখানে:
- file_name: আপলোড করা ফাইলের নাম।
- file_path: ফাইলটির সার্ভারে সংরক্ষিত অবস্থান (path)।
- upload_date: ফাইলটি আপলোড করার তারিখ এবং সময়।
4. ফাইলের ডাটা দেখানো
আপলোড করা ফাইলগুলো ডাটাবেস থেকে রিট্রিভ করে প্রদর্শন করতে চাইলে, নিম্নলিখিত কোড ব্যবহার করতে পারেন:
<?php
$host = "localhost";
$user = "root";
$password = "";
$dbname = "test";
// MySQLi connection
$conn = new mysqli($host, $user, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Retrieve files from database
$sql = "SELECT * FROM files";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "File: <a href='" . $row['file_path'] . "'>" . $row['file_name'] . "</a><br>";
}
} else {
echo "No files found.";
}
$conn->close();
?>
এখানে ডাটাবেস থেকে আপলোড করা ফাইলের তথ্য (ফাইলের নাম এবং অবস্থান) রিট্রিভ করে HTML লিঙ্কের মাধ্যমে প্রদর্শন করা হয়েছে।
সারাংশ
- ফাইল আপলোড এবং সংরক্ষণের জন্য, প্রথমে একটি HTML ফর্ম তৈরি করতে হয়, যেখানে ব্যবহারকারী ফাইলটি নির্বাচন করবে।
- PHP স্ক্রিপ্ট ব্যবহার করে ফাইলটি সার্ভারে আপলোড করা হয় এবং MySQLi এর মাধ্যমে ফাইলের তথ্য ডাটাবেসে সংরক্ষিত হয়।
- ফাইলের নাম এবং অবস্থান MySQLi এর মাধ্যমে ডাটাবেসে ইনসার্ট করা হয়, যাতে আপনি পরে সেগুলো রিট্রিভ এবং ডিসপ্লে করতে পারেন।
- নিরাপত্তার জন্য ফাইলের টাইপ এবং সাইজ চেক করা উচিত, এবং ব্যবহারকারীকে শুধু নির্দিষ্ট টাইপের ফাইল আপলোড করতে অনুমতি দেওয়া উচিত।
MySQLi ব্যবহার করে আপনি ডেটাবেসের মাধ্যমে ফাইল আপলোড, রিড, এবং ডাউনলোড করতে পারেন। সাধারণত, ফাইলগুলি ডেটাবেসে BLOB (Binary Large Object) ফিল্ডের মাধ্যমে সঞ্চিত করা হয় এবং পরে সেগুলি রিড বা ডাউনলোড করা হয়। এই প্রক্রিয়াটি একটি ওয়েব অ্যাপ্লিকেশনে ফাইল ম্যানেজমেন্টের জন্য খুবই কার্যকর।
1. ফাইল আপলোড করা MySQLi ডেটাবেসে
ফাইল আপলোড করার জন্য প্রথমে HTML ফর্মের মাধ্যমে ফাইলটি ইউজারের কাছ থেকে নেওয়া হয়, তারপর PHP স্ক্রিপ্টের মাধ্যমে MySQLi ডেটাবেসে সেভ করা হয়।
উদাহরণ:
<?php
// ডেটাবেস কানেকশন তৈরি
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
// কানেকশন চেক
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// ফাইল আপলোডের জন্য ফর্ম প্রক্রিয়া
if (isset($_POST['submit'])) {
// ফাইল ইনপুট
$file = $_FILES['fileToUpload']['tmp_name'];
$fileName = $_FILES['fileToUpload']['name'];
$fileContent = file_get_contents($file); // ফাইলের কনটেন্ট নেয়া
// SQL ইনসার্ট কোয়েরি
$stmt = $conn->prepare("INSERT INTO files (file_name, file_data) VALUES (?, ?)");
$stmt->bind_param("sb", $fileName, $fileContent); // "s" স্ট্রিং এবং "b" ব্লব ডেটার জন্য
$stmt->execute();
echo "File uploaded successfully!";
}
// ফাইল আপলোড ফর্ম
?>
<form action="" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
<?php
$conn->close();
?>
ব্যাখ্যা:
$_FILES['fileToUpload']['tmp_name']দিয়ে ফাইলের সাময়িক পাথ নেওয়া হয়।file_get_contents()ফাংশন ব্যবহার করে ফাইলের কনটেন্ট ডেটাবেসে সেভ করার জন্য সংগ্রহ করা হয়।- ডেটাবেসে
file_dataকলামটি BLOB টাইপ হিসেবে তৈরি করা উচিত, যাতে বাইনারি ডেটা সঞ্চিত করা যায়।
2. ফাইল ডাউনলোড করা MySQLi ডেটাবেস থেকে
ফাইল ডাউনলোড করার জন্য, ডেটাবেস থেকে ফাইলের কনটেন্ট বের করে তা ইউজারের ব্রাউজারে পাঠাতে হবে। এটি HTTP হেডার ব্যবহার করে করা হয়, যাতে ফাইলটি ডাউনলোড হিসেবে চলে যায়।
উদাহরণ:
<?php
// ডেটাবেস কানেকশন তৈরি
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
// কানেকশন চেক
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// ফাইল আইডি দিয়ে ফাইল রিট্রিভ করা
$fileId = 1; // উদাহরণস্বরূপ, ID 1 এর ফাইল ডাউনলোড করা হবে
$stmt = $conn->prepare("SELECT file_name, file_data FROM files WHERE id = ?");
$stmt->bind_param("i", $fileId);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($fileName, $fileContent);
$stmt->fetch();
// HTTP হেডার ব্যবহার করে ফাইল ডাউনলোড করা
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . $fileName);
header("Content-Length: " . strlen($fileContent));
echo $fileContent; // ফাইল কনটেন্ট ব্রাউজারে পাঠানো
// সংযোগ বন্ধ করা
$stmt->close();
$conn->close();
?>
ব্যাখ্যা:
SELECT file_name, file_data FROM files WHERE id = ?এই কোয়েরি ব্যবহার করে ডেটাবেস থেকে নির্দিষ্ট ফাইল আইডি অনুযায়ী ফাইলের নাম এবং কনটেন্ট বের করা হয়।header()ফাংশন ব্যবহার করে ব্রাউজারকে জানানো হয় যে, এটি একটি ডাউনলোডযোগ্য ফাইল।Content-Type: application/octet-streamব্রাউজারকে জানায় যে এটি একটি বাইনারি ফাইল।Content-Disposition: attachmentনির্দেশ দেয় যে ফাইলটি ডাউনলোড করতে হবে, তা প্রদর্শিত হবে না।
3. ফাইল ডাউনলোডের নিরাপত্তা নিশ্চিত করা
ফাইল আপলোড এবং ডাউনলোডের সময় কিছু নিরাপত্তা ব্যবস্থা গ্রহণ করা উচিত, যেমন:
- ফাইল টাইপ চেক করা: নিশ্চিত করুন যে শুধুমাত্র নির্দিষ্ট ধরনের ফাইল (যেমন
.jpg,.pdf) আপলোড করা হচ্ছে। - ফাইল সাইজ চেক করা: অতিরিক্ত বড় ফাইল আপলোড হওয়ার আগেই সাইজ চেক করুন।
- SQL Injection থেকে বাঁচা: Prepared Statements ব্যবহার করে SQL Injection থেকে সুরক্ষা নিশ্চিত করুন।
ফাইল টাইপ এবং সাইজ চেক করার উদাহরণ:
<?php
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf']; // অনুমোদিত MIME টাইপ
$maxSize = 5 * 1024 * 1024; // 5MB
// ফাইল চেকিং
$fileType = $_FILES['fileToUpload']['type'];
$fileSize = $_FILES['fileToUpload']['size'];
if (in_array($fileType, $allowedTypes) && $fileSize <= $maxSize) {
// ফাইল আপলোড প্রক্রিয়া চালানো
// ...
} else {
echo "Invalid file type or file size exceeds the limit!";
}
?>
সারাংশ
MySQLi ব্যবহার করে ডেটাবেসে ফাইল আপলোড এবং ডাউনলোডের প্রক্রিয়া খুবই সহজ এবং নিরাপদ হতে পারে যদি সঠিকভাবে ফাইল কনটেন্ট বাইনারি ফরম্যাটে সংরক্ষণ করা হয়। file_get_contents() ব্যবহার করে ফাইল কনটেন্ট ডেটাবেসে সেভ করা যায় এবং header() ফাংশন ব্যবহার করে ফাইল ডাউনলোড করা সম্ভব। ফাইল আপলোড এবং ডাউনলোডের সময় নিরাপত্তা নিশ্চিত করা অত্যন্ত গুরুত্বপূর্ণ।
Read more