Kodokon kodokon.com

फ़ाइलें: पढ़ना, लिखना, अपलोड, JSON

फ़ाइलें पढ़ें और लिखें, घटनाओं को लॉग करें, अपलोड को सुरक्षित रूप से स्वीकार करें, और अपने डेटा को JSON के रूप में संग्रहीत करें।

10 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

किसी फ़ाइल को पढ़ने के लिए एक ही फ़ंक्शन लगता है: file_get_contents() पूरी सामग्री को एक स्ट्रिंग के रूप में लौटाता है, file() इसे लाइनों के एक ऐरे में विभाजित करता है। पढ़ने से पहले, is_readable() से पहुँच की जाँच करें: एक टूटा हुआ पथ एक चेतावनी के साथ false लौटाएगा।

PHP
<?php

declare(strict_types=1);

$path = __DIR__ . '/notes.txt';

if (!is_readable($path)) {
    exit("File not found or unreadable.");
}

$content = (string) file_get_contents($path);
echo nl2br(htmlspecialchars($content, ENT_QUOTES));

$lines = file(
    $path,
    FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES
);
echo count($lines) . " non-empty line(s)";
एक ही फ़ाइल को पूरा पढ़ना, फिर लाइन-दर-लाइन।

लिखने के लिए, file_put_contents() डिफ़ॉल्ट रूप से पूरी सामग्री को बदल देता है। दो फ़्लैग चीज़ें बदल देते हैं: FILE_APPEND अधिलेखित करने के बजाय अंत में जोड़ता है, LOCK_EX एक विशिष्ट लॉक लगाता है ताकि दो एक साथ आने वाली रिक्वेस्ट अपने लेखन को न मिलाएँ। यही एक न्यूनतम एप्लिकेशन लॉग की विधि है।

PHP
<?php

declare(strict_types=1);

$logFile = __DIR__ . '/app.log';

$line = sprintf(
    "[%s] New order from %s\n",
    date('Y-m-d H:i:s'),
    'alice@example.com'
);

file_put_contents(
    $logFile,
    $line,
    FILE_APPEND | LOCK_EX
);

echo "Event logged.";
कुछ लाइनों में एक विश्वसनीय एप्लिकेशन लॉग।

फ़ाइल अपलोड विशेष सावधानी के योग्य हैं। फ़ॉर्म को enctype="multipart/form-data" घोषित करना चाहिए, फिर PHP प्राप्त फ़ाइल का वर्णन $_FILES में करता है। हर चीज़ को सत्यापित करें: त्रुटि कोड, आकार, और finfo द्वारा पहचाना गया वास्तविक टाइप - कभी भी एक्सटेंशन या ब्राउज़र द्वारा घोषित टाइप को नहीं। अंत में, केवल move_uploaded_file() को ही अस्थायी फ़ाइल को स्थानांतरित करना चाहिए।

PHP
<?php

declare(strict_types=1);

$maxSize = 2 * 1024 * 1024;
$file = $_FILES['avatar'] ?? null;

if ($file === null || $file['error'] !== UPLOAD_ERR_OK) {
    exit("No valid file received.");
}

if ($file['size'] > $maxSize) {
    exit("File too large (2 MB max).");
}

$info = new finfo(FILEINFO_MIME_TYPE);
$mime = $info->file($file['tmp_name']);
$allowed = ['image/jpeg' => 'jpg', 'image/png' => 'png'];

if (!isset($allowed[$mime])) {
    exit("Format not allowed.");
}

$name = bin2hex(random_bytes(8));
$target = __DIR__ . '/uploads/' . $name
    . '.' . $allowed[$mime];

move_uploaded_file($file['tmp_name'], $target);
echo "Image saved.";
upload.php: आकार, वास्तविक टाइप, और फ़ाइल का नाम नियंत्रण में।

JSON प्रारूप PHP और बाकी दुनिया के बीच एक स्वाभाविक सेतु है: json_encode() किसी ऐरे को क्रमबद्ध करता है, json_decode() इसका उल्टा करता है। साहचर्य ऐरे पाने के लिए दूसरे आर्गुमेंट के रूप में true पास करें, और विकृत JSON को एक खामोश null के बजाय एक स्पष्ट अपवाद में बदलने के लिए JSON_THROW_ON_ERROR फ़्लैग पास करें।

PHP
<?php

declare(strict_types=1);

$path = __DIR__ . '/tasks.json';

$json = is_readable($path)
    ? (string) file_get_contents($path)
    : '[]';

$tasks = json_decode(
    $json,
    true,
    512,
    JSON_THROW_ON_ERROR
);

$tasks[] = [
    'title' => 'Review the lesson',
    'done' => false,
];

file_put_contents(
    $path,
    json_encode(
        $tasks,
        JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
    ),
    LOCK_EX
);

echo count($tasks) . " task(s) saved";
एक मिनी डेटा स्टोर: पढ़ना, बदलना, फिर से लिखना।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. file_put_contents() को पास किया गया FILE_APPEND फ़्लैग क्या करता है?
    • यह सामग्री को अधिलेखित करने के बजाय फ़ाइल के अंत में जोड़ता है
    • यदि मूल फ़ोल्डर मौजूद न हो तो यह उसे बनाता है
    • यह लेखन के दौरान फ़ाइल को लॉक करता है
  2. किसी अपलोड की जाँच के लिए आपको $_FILES['avatar']['type'] पर क्यों भरोसा नहीं करना चाहिए?
    • यह कुंजी केवल कुछ सर्वरों पर मौजूद है
    • यह केवल छवियों के लिए काम करता है
    • यह वैल्यू ब्राउज़र द्वारा भेजी जाती है और इसे गढ़ा जा सकता है; आपको वास्तविक टाइप को finfo से पहचानना होगा
  3. json_decode($json, true) में दूसरा आर्गुमेंट true क्या बदलता है?
    • डिकोडिंग त्रुटि होने पर एक अपवाद फेंकती है
    • JSON ऑब्जेक्ट stdClass ऑब्जेक्ट के बजाय PHP साहचर्य ऐरे बन जाते हैं
    • कुंजियाँ बड़े अक्षरों में बदल दी जाती हैं