Reputation: 117
This code works properly to make the ZIP file with the wanted files, except the filenames in the archive, which are not in English (in this case they are Hebrew), have weird characters instead of the proper hebrew letters.
<?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;
?>
I did some searching around, it seems that iconv, setlocalte, or mb_convert_encoding might help, but whatever I tried didn't work.
Any ideas?
P.S. As a side question, is there a way to not keep directory structure in the zip?
ETA:
An example of the $_post
may be www.domain.com/path/שלום_01.mp3
Upvotes: 0
Views: 3297
Reputation: 117
Yay! Fixed!
First the code, then an explanation:
<?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 things needed to be changed.
setlocale()
needs to include the .UTF-8 at the end.$localname
for addFile, and its basically iconv("UTF-8","CODE_PAGE_REF",$localname)
Upvotes: 5