ویژگی تصویر

تابع zip_entry_filesize() در PHP

  /  PHP   /  تابع zip_entry_filesize() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع zip_entry_filesize() یکی از توابع رابط پروسیجرال مربوط به کار با آرشیوهای ZIP در PHP است. این تابع اندازه (به بایت) فایل داخل یک ورودی (entry) آرشیو ZIP را برمی‌گرداند. در این مقاله ساختار، مثال‌های عملی، کاربردها و نکات فنی مرتبط با این تابع توضیح داده می‌شود و در انتها روش‌های به‌روزتر مانند ZipArchive نیز معرفی می‌شود.

وقتی از zip_entry_filesize() استفاده کنیم؟

  • برای بدست آوردن اندازهٔ بدون فشرده‌سازی (uncompressed size) یک فایل داخل آرشیو.
  • برای تصمیم‌گیری دربارهٔ استخراج یا پردازش فایل (مثلاً نادیده‌گرفتن فایل‌های خیلی بزرگ).
  • هنگام نمایش اطلاعات متادیتا برای کاربر (مثلاً در یک فایل‌لیست نمای وب).

امضای تابع و مقدار بازگشتی

این تابع به صورت پروسیجرال و با گرفتن یک resource مربوط به ورودی آرشیو استفاده می‌شود (مقداری که از zip_read به دست می‌آید).

پارامترنوعتوضیح
zip_entryresourceرفرنس به ورودی (entry) جاری برگرفته از zip_read()
مقدار بازگشتیمعنی
integer (bytes)اندازهٔ فایل بدون فشرده‌سازی
-1خطا یا عدم امکان خواندن اندازه

نمونهٔ پایه — خواندن لیست فایل‌ها و اندازه‌ها

$zip = zip_open('archive.zip');
if ($zip) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        $size = zip_entry_filesize($entry);
        echo $name . " - " . $size . " bytesn";
    }
    zip_close($zip);
} else {
    echo "Cannot open ZIP archiven";
}

این کد آرشیو را باز می‌کند، تک‌تک entryها را می‌خواند، اسم و اندازهٔ هر entry را با zip_entry_filesize() نمایش می‌دهد و در پایان آرشیو را می‌بندد. اگر فایل قابل باز شدن نباشد پیام خطا داده می‌شود.

مثال عملی — استخراج تنها فایل‌های کوچک‌تر از آستانه

$threshold = 5 * 1024 * 1024; // 5 MB
$zip = zip_open('uploads/archive.zip');
if ($zip) {
    while ($entry = zip_read($zip)) {
        $size = zip_entry_filesize($entry);
        $name = zip_entry_name($entry);
        if ($size >= 0 && $size <= $threshold) {
            if (zip_entry_open($zip, $entry, "r")) {
                $contents = zip_entry_read($entry, $size);
                file_put_contents('/tmp/' . basename($name), $contents);
                zip_entry_close($entry);
            }
        } else {
            // نادیده گرفتن فایل‌های بزرگ یا خطا در خواندن اندازه
        }
    }
    zip_close($zip);
}

در این مثال ابتدا اندازهٔ هر entry بررسی می‌شود و تنها فایل‌هایی که از آستانه کم‌تر هستند باز و خوانده می‌شوند. دقت کنید که zip_entry_read نیاز به دانستن تعداد بایت‌هایی که خوانده می‌شود دارد، بدین‌خاطر گرفتن اندازه از zip_entry_filesize مفید است.

نکات کاربردی و محدودیت‌ها

  • zip_entry_filesize اندازهٔ دادهٔ بدون فشرده‌سازی را برمی‌گرداند، نه سایز فشرده‌شده داخل آرشیو. برای سایز فشرده‌شده می‌توان از zip_entry_compressedsize() استفاده کرد.
  • رابط پروسیجرال (zip_open/zip_read/zip_entry_*) در نسخه‌های جدیدتر PHP کمتر توصیه می‌شود؛ کلاس ZipArchive معمولاً انعطاف و پایداری بیشتری دارد.
  • در صورت بروز خطا ممکن است مقدار -1 بازگردانده شود؛ بنابراین همیشه مقدار بازگشتی را بررسی کنید.
  • برای آرشیوهای بزرگ یا بارگزاری از منابع ناامن، بهتر است اندازه‌ها را محدود کنید تا از مصرف بیش از حد حافظه یا حملات zip bomb جلوگیری شود.

جایگزین مدرن — استفاده از ZipArchive

$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
    for ($i = 0; $i numFiles; $i++) {
        $stat = $zip->statIndex($i);
        echo $stat['name'] . " - " . $stat['size'] . " bytesn";
    }
    $zip->close();
} else {
    echo "Failed to open archiven";
}

این روش از کلاس ZipArchive استفاده می‌کند که روش استاندارد و پیشنهادشده برای کار با ZIP در PHP است. متد statIndex اطلاعات متادیتا از جمله ‘size’ (اندازهٔ غیر فشرده) و ‘comp_size’ (اندازهٔ فشرده) را برمی‌گرداند.

مقایسهٔ سریع

ویژگیzip_entry_filesize()ZipArchive::statIndex()
رابطپروسیجرالشیءگرا
پایداری و امکاناتپایین‌تر، قدیمیقوی‌تر، توابع بیشتر
قابلیت‌های پیشرفتهمحدودقابل اطمینان‌تر برای استخراج، فیلترینگ و مدیریت

نکات امنیتی و عملکرد

  • همیشه ورودی‌های آرشیو از منابع ناامن را بررسی و محدود کنید (مثلاً اندازهٔ فایل، تعداد فایل‌ها، نام مسیرها) تا از حملات zip slip یا zip bomb جلوگیری شود.
  • برای مقادیر بزرگ‌تر از حافظهٔ در دسترس، از خواندن جزئی (chunked read) به جای خواندن کامل فایل در حافظه استفاده کنید.
  • اگر نیاز به کار موازی یا پردازش حجم بالا دارید، ZipArchive با قابلیت‌های بهینه‌شده بهتر عمل می‌کند.

جمع‌بندی و توصیه‌ها

تابع zip_entry_filesize() ابزار ساده‌ای برای به‌دست آوردن اندازهٔ فایل داخل یک entry از آرشیو ZIP است و مناسب سناریوهای سبک یا کدهای قدیمی است. اما برای پروژه‌های جدیدتر یا کاربردهای پیچیده، استفاده از ZipArchive توصیه می‌شود. در هر صورت، همیشه مقدار بازگشتی را بررسی کنید، از اعتبارسنجی اندازه‌ها برای امنیت استفاده نمایید و در صورت نیاز استخراج فایل‌ها را به صورت chunked انجام دهید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: