Этот код работает правильно, чтобы сделать ZIP-файл с нужными файлами, за исключением файлов в архиве, которые не находятся на английском языке (в данном случае они являются ивритом), имеют странные символы вместо правильных букв на иврите.
<?php $filesfordown = $_POST['GEMin']; if(empty($filesfordown)) { echo "No files were seleceted for download."; } else { $zip_name = "RMW." . time() . ".zip"; $zip = new ZipArchive; $zip->open($zip_name, ZipArchive::CREATE); foreach ($filesfordown as $filefordown) { $zip->addFile($filefordown); } $zip->close(); } header('Content-Type: application/zip'); header("Content-disposition: attachment; filename='$zip_name'"); header('Content-Length: ' . filesize($zip_name)); readfile($zip_name); ob_flush; ?>
Я немного искал, кажется, что iconv, setlocalte или mb_convert_encoding могут помочь, но все, что я пробовал, не работает.
Есть идеи?
PS Как побочный вопрос, есть ли способ не сохранять структуру каталогов в zip?
ETA: Примером $_post
может быть www.domain.com/path/ שלום_01. Mp3
Ура! Исправлена!
Сначала код, затем объяснение:
<?php setlocale(LC_ALL, 'he_IL.UTF-8'); $filesfordown = $_POST['GEMin']; if(empty($filesfordown)) { echo "לא נבחרו.. נסה שוב"; } else { $zip_name = "RMW" . time() . ".zip"; $zip = new ZipArchive; $zip->open($zip_name, ZipArchive::CREATE); echo "מכין את ההורדה..."; foreach ($filesfordown as $filefordown) { $zip->addFile($filefordown, iconv("UTF-8","CP862",basename($filefordown))); } $zip->close();
3 вещи нужно было изменить.
setlocale()
должен включать .UTF-8 в конце. $localname
для addFile и ее в основном iconv("UTF-8","CODE_PAGE_REF",$localname)
Он также работает с: iconv("UTF-8", "CP852", $nameFile);