Comment

PHP প্রসেসিং ফর্ম (Processing Forms)

PHP একাধিক ফাইল আপলোড করুন

Estimated reading: 5 minutes 10 views Contributors

সারাংশ: এই টিউটোরিয়ালে, আপনি শিখবেন কিভাবে পিএইচপি সার্ভারে একাধিক ফাইল নিরাপদে আপলোড করতে হয়।

PHP একাধিক ফাইল আপলোড ভূমিকা

আগের টিউটোরিয়ালে, আপনি শিখেছেন কিভাবে পিএইচপি-তে একটি ক্লায়েন্ট থেকে ওয়েব সার্ভারে একটি ফাইল আপলোড করতে হয়। একটি ফাইল আপলোড করার সমস্ত নিয়ম একাধিক ফাইলের সাথে প্রাসঙ্গিক।

আগের টিউটোরিয়ালে, আপনি শিখেছেন কিভাবে পিএইচপি-তে একটি ক্লায়েন্ট থেকে ওয়েব সার্ভারে একটি ফাইল আপলোড করতে হয়। একটি ফাইল আপলোড করার সমস্ত নিয়ম একাধিক ফাইলের সাথে প্রাসঙ্গিক।

<form action="index.php" method="post" enctype="multipart/form-data">

দ্বিতীয়ত, ফাইল ইনপুট এলিমেন্টে অবশ্যই একাধিক অ্যাট্রিবিউট থাকতে হবে এবং এর নামের সাথে অবশ্যই বর্গাকার বন্ধনী ([]) থাকতে হবে:

<input type="file" name="files[]" id="files" multiple />

PHP-তে, আপলোড করা ফাইলগুলির তথ্য পেতে আপনি $_FILES[‘files’] অ্যাক্সেস করতে পারেন:

<?php

var_dump($_FILES['files']);

‘ফাইলস’ হল ফাইল ইনপুট উপাদানের নাম।

PHP একাধিক ফাইল আপলোড উদাহরণ

নিম্নলিখিত উদাহরণটি ফাইল আপলোড টিউটোরিয়ালে তৈরি বিদ্যমান ফাংশন এবং যুক্তি পুনরায় ব্যবহার করে।

প্রথমত, নিম্নলিখিত প্রকল্প কাঠামো তৈরি করুন:

├── inc
|  ├── flash.php
|  └── functions.php
├── index.php
├── upload.php
└── uploads

দ্বিতীয়ত, ফাইল আপলোড ফর্ম তৈরি করতে index.php-এ নিম্নলিখিত কোড যোগ করুন:

<?php
session_start();
require_once __DIR__ . '/inc/flash.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>PHP upload multiple files</title>
    <link rel="stylesheet" href="https://www.phptutorial.net/app/css/style.css" />
</head>
<body>
<?php flash('upload') ?>
<main>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <div>
            <label for="files">Select files to upload:</label>
            <input type="file" name="files[]" id="files" multiple required/>
        </div>
        <div>
            <button type="submit">Upload</button>
        </div>
    </form>
</main>
</body>
</html>

index.php নিম্নলিখিত কাজ করে:

1) একটি নতুন অধিবেশন শুরু করুন বা একটি বিদ্যমান অধিবেশন পুনরায় শুরু করুন:

session_start();

2) inc/flash.php ফাইল থেকে কোড লোড করুন:

require_once __DIR__ . '/inc/flash.php';

3) ‘আপলোড’ নামের একটি বার্তা দেখানোর জন্য ফ্ল্যাশ() ফাংশনটি কল করুন। Flash() ফাংশন flash.php ফাইলে সংজ্ঞায়িত করা হয়েছে।

<?php flash('upload') ?>

4) একটি আপলোড ফর্ম তৈরি করুন যা upload.php ফাইলে জমা দেয়।

তৃতীয়ত, একাধিক ফাইল যাচাই ও আপলোড করতে upload.php ফাইলে নিম্নলিখিত কোড যোগ করুন:

<?php

session_start();

require_once __DIR__ . '/inc/flash.php';
require_once __DIR__ . '/inc/functions.php';

const ALLOWED_FILES = [
    'image/png' => 'png',
    'image/jpeg' => 'jpg'
];

const MAX_SIZE = 5 * 1024 * 1024; //  5MB

const UPLOAD_DIR = __DIR__ . '/uploads';


$is_post_request = strtolower($_SERVER['REQUEST_METHOD']) === 'post';
$has_files = isset($_FILES['files']);

if (!$is_post_request || !$has_files) {
    redirect_with_message('Invalid file upload operation', FLASH_ERROR);
}

$files = $_FILES['files'];
$file_count = count($files['name']);

// validation
$errors = [];
for ($i = 0; $i < $file_count; $i++) {
    // get the uploaded file info
    $status = $files['error'][$i];
    $filename = $files['name'][$i];
    $tmp = $files['tmp_name'][$i];

    // an error occurs
    if ($status !== UPLOAD_ERR_OK) {
        $errors[$filename] = MESSAGES[$status];
        continue;
    }
    // validate the file size
    $filesize = filesize($tmp);

    if ($filesize > MAX_SIZE) {
        // construct an error message
        $message = sprintf("The file %s is %s which is greater than the allowed size %s",
            $filename,
            format_filesize($filesize),
            format_filesize(MAX_SIZE));

        $errors[$filesize] = $message;
        continue;
    }

    // validate the file type
    if (!in_array(get_mime_type($tmp), array_keys(ALLOWED_FILES))) {
        $errors[$filename] = "The file $filename is allowed to upload";
    }
}

if ($errors) {
    redirect_with_message(format_messages('The following errors occurred:',$errors), FLASH_ERROR);
}

// move the files
for($i = 0; $i < $file_count; $i++) {
    $filename = $files['name'][$i];
    $tmp = $files['tmp_name'][$i];
    $mime_type = get_mime_type($tmp);

    // set the filename as the basename + extension
    $uploaded_file = pathinfo($filename, PATHINFO_FILENAME) . '.' . ALLOWED_FILES[$mime_type];
    // new filepath
    $filepath = UPLOAD_DIR . '/' . $uploaded_file;

    // move the file to the upload dir
    $success = move_uploaded_file($tmp, $filepath);
    if(!$success) {
        $errors[$filename] = "The file $filename was failed to move.";
    }
}

$errors ?
    redirect_with_message(format_messages('The following errors occurred:',$errors), FLASH_ERROR) :
    redirect_with_message('All the files were uploaded successfully.', FLASH_SUCCESS);

কিভাবে upload.php কাজ করে:

1) একটি নতুন অধিবেশন শুরু করুন বা বিদ্যমান একটি পুনরায় শুরু করুন:

session_start();

2) flash.php এবং functions.php থেকে কোড লোড করুন:

require_once __DIR__ . '/inc/flash.php';
require_once __DIR__ . '/inc/functions.php';

মনে রাখবেন আপনি ফ্ল্যাশ বার্তা টিউটোরিয়াল থেকে flash.php এবং ফাইল আপলোড টিউটোরিয়াল থেকে functions.php ব্যবহার করবেন।

যেহেতু upload.php একাধিক ফাইল নিয়ে কাজ করে, তাই এটি একাধিক ত্রুটি বার্তা জারি করবে, প্রতিটি আপলোড করা ফাইলের জন্য একটি।

এটিকে সুবিধাজনক করতে, আমরা এমন একটি ফাংশন সংজ্ঞায়িত করতে পারি যা একাধিক ত্রুটি বার্তা থেকে একটি একক ত্রুটি বার্তা প্রদান করে:

function format_messages(string $title, array $messages): string
{
    $message = "<p>$title</p>";
    $message .= '<ul>';
    foreach ($messages as $key => $value) {
        $message .= "<li>$value</li>";
    }
    $message .= '<ul>';

    return $message;
}

এবং functions.php ফাইলে এই format_messages() ফাংশন যোগ করুন।

3) যদি অনুরোধের পদ্ধতিটি POST না হয় বা $_FILES-এ ফাইল ক্ষেত্র না থাকে তাহলে একটি ত্রুটি বার্তা ফেরত দিন:

$is_post_request = strtolower($_SERVER['REQUEST_METHOD']) === 'post';
$has_files = isset($_FILES['files']);

if (!$is_post_request || !$has_files) {
    redirect_with_message('Invalid file upload operation', FLASH_ERROR);
}

4) $_FILES থেকে আপলোড করা ফাইল এবং আপলোড করা ফাইলের সংখ্যা পান:

$files = $_FILES['files'];
$file_count = count($files['name']);

5) প্রতিটি আপলোড করা ফাইলের জন্য, ত্রুটি কোড পরীক্ষা করুন এবং ফাইলের আকার যাচাই করুন, টাইপ করুন। যদি একটি ত্রুটি ঘটে থাকে, $errors অ্যারেতে একটি ত্রুটি বার্তা যোগ করুন, বর্তমান বৈধতা লুপটি এড়িয়ে যান এবং পরবর্তী ফাইলটি যাচাই করুন৷

// validation
$errors = [];
for ($i = 0; $i < $file_count; $i++) {
    // get the uploaded file info
    $status = $files['error'][$i];
    $filename = $files['name'][$i];
    $tmp = $files['tmp_name'][$i];

    // an error occurs
    if ($status !== UPLOAD_ERR_OK) {
        $errors[$filename] = MESSAGES[$status];
        continue;
    }
    // validate the file size
    $filesize = filesize($tmp);

    if ($filesize > MAX_SIZE) {
        // construct an error message
        $message = sprintf("The file %s is %s which is greater than the allowed size %s",
            $filename,
            format_filesize($filesize),
            format_filesize(MAX_SIZE));

        $errors[$filesize] = $message;
        continue;
    }

    // validate the file type
    if (!in_array(get_mime_type($tmp), array_keys(ALLOWED_FILES))) {
        $errors[$filename] = "The file $filename is allowed to upload";
    }
}

কোনো ত্রুটি দেখা দিলে, index.php-এ ফিরে যান এবং ত্রুটি বার্তাটি দেখান:

if ($errors) {
    redirect_with_message(format_messages('The following errors occurred:',$errors), FLASH_ERROR);
}

মনে রাখবেন যে আমরা $errors অ্যারেকে একটি একক ফরম্যাট করা ত্রুটি বার্তায় রূপান্তর করতে format_messages() ফাংশন ব্যবহার করি।

6) যদি কোন ত্রুটি না ঘটে, প্রতিটি ফাইল আপলোড ডিরেক্টরিতে সরান:

// move the files
for($i = 0; $i < $file_count; $i++) {
    $filename = $files['name'][$i];
    $tmp = $files['tmp_name'][$i];
    $mime_type = get_mime_type($tmp);

    // set the filename as the basename + extension
    $uploaded_file = pathinfo($filename, PATHINFO_FILENAME) . '.' . ALLOWED_FILES[$mime_type];
    // new filepath
    $filepath = UPLOAD_DIR . '/' . $uploaded_file;

    // move the file to the upload dir
    $success = move_uploaded_file($tmp, $filepath);
    if(!$success) {
        $errors[$filename] = "The file $filename was failed to move.";
    }
}

8) যদি পদক্ষেপে ত্রুটি থাকে তবে ত্রুটি বার্তাটি দেখান। অন্যথায়, একটি সফল বার্তা দেখান:

$errors ?
    redirect_with_message(format_messages('The following errors occurred:',$errors), FLASH_ERROR) :
    redirect_with_message('All the files were uploaded successfully.', FLASH_SUCCESS);

সারসংক্ষেপ

  • ফর্মে ফাইল আপলোডিং সক্ষম করতে ফর্মের এনক্টিপ অ্যাট্রিবিউটকে “মাল্টিপার্ট/ফর্ম-ডেটা” এ সেট করুন৷
  • একাধিক অ্যাট্রিবিউট সেট করুন এবং একাধিক ফাইল আপলোড করতে ফাইল ইনপুট এলিমেন্টে বর্গাকার বন্ধনী ([]) যোগ করুন।
  • $_FILES-এ থাকা তথ্যগুলি প্রক্রিয়া করার আগে সর্বদা যাচাই করুন৷
  • আপলোড ফাইলগুলি সরাতে move_uploaded_file() ফাংশনটি ব্যবহার করুন।

Leave a Comment

Share this Doc

PHP একাধিক ফাইল আপলোড করুন

Or copy link

CONTENTS

Subscribe

×
Cancel