شاید با این مشکل بر خورده باشید که نیاز باشه چند فایل رو به وسیله header برای کاربر قابل دانلود کنید.اما در اصل چنین چیزی امکان پذیر نیست و header فقط میتونه یک فایل رو برای دانلود به سمت کاربر ارسال کنه.
راه حل این روش اینه که ابتدا فایلهاتون رو فشرده کنید سپس به سمت کاربر بفرستید.
با استفاده از کد زیر میتونید چند فایل رو باهم فشرده کنید و با استفاده از header ها دانلود کنید.
function zipFilesAndDownload($file_names,$archive_file_name,$file_path) { //create the object $zip = new ZipArchive(); //create the file and throw the error if unsuccessful if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) { exit("cannot open <$archive_file_name>\n"); } //add each files of $file_name array to archive foreach($file_names as $files) { $zip->addFile($file_path.$files,$files); } $zip->close(); header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=$archive_file_name"); header("Pragma: no-cache"); header("Expires: 0"); readfile("$archive_file_name"); exit; }
برای استفاده از این تابع هم به صورت زیر عمل میکنیم :
$file_names=array('test.php','test1.txt'); $archive_file_name='zipped.zip'; $file_path=dirname(__FILE__).'/'; zipFilesAndDownload($file_names,$archive_file_name,$file_path);
منبع : http://answers.webhostinggeeks.com/how-to-use-php-to-force-download-multiple-files-in-zip-archive-944
سلام. مطلب بسیار خوبی بود . تشکر ♥
عالي بود. ممنون
درود
ممنون عالی بود
فقط من فایل هام را قبل از فراخوانی این تابع بررسی میکنم با مقدار فایل هام بعد از فراخوانی فرق داره
البته من مقدار اون فایل ها را به صورت رندوم تعیین می کنم ولی با دیباگر چک کردم اصلا متوجه نمی شوم یه دفعه چرا این جوری میشه
درود
دانلود فایل تولید شده توسط خود مرورگر یه درستی انجام میشه ولی وقتی IDM نصب باشه نمی تونه اون فایل را دانلود کنه
فانکشن جالبیه
فقط چند نکته بنظرم رسید که بهتره پارامتر ۱ رو type اش رو array تعیین کنید که نوع دیگه ای وارد بشه دچار مشکل نشه.
در خط ۷ هم بنظرتون exception ارسال بشه بجای exit نمی تونه بهتر باشه؟
چون بنظرم اینطوری می شه جریان برنامه رو هم به نوعی کنترل کرد و خطا ها رو به شکل مناسبتری هندل کرد.
در خط 22 هم بنظرم از return بجای exit استفاده بشه مناسبتر باشه چون داخل funciton هستیم.
در کل ایده جالبیه 🙂