I am trying to zip all files and folder within a folder The structure looks like so:
storage/app/3
- folder 1
-file 1
-file 2
- folder 2
-file 3
When I run the zip script I want the zip to be 3.zip with all the folders and files in the next level However I always end up with:
3.zip
- 3
- folder 1
-file 1
-file 2
- folder 2
-file 3
Where I want:
3.zip
- folder 1
-file 1
-file 2
- folder 2
-file 3
The code works on my Linux servers, but on IIS and windows I get the additional level.
This is my code:
$rootPath = public_path() .'/storage/app/' . $request->course_id . '/';
$zip = new ZipArchive();
$zip->open(public_path() .'/storage/app/' . $request->course_id . '/' . $request->course_id . '.zip', (ZipArchive::CREATE | ZipArchive::OVERWRITE));
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($rootPath),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach($files as $name => $file) {
if (!$file->isDir() AND (strpos($name, $request->course_id.'.zip') === FALSE)){
$zip->addFile($file, str_replace("C:\sites\cnnect-portal\public/storage/app/","", $file));
}
}
I have tried to exclude the file from the loop by saying 'if $name == $request->course_id' skip this but that doesnt work because I dont see $name ever being just the folder name.
This will extracts the filename from the path.
$zip->addFile($file,basename($file));
And another guess would be that you need to include course_id
here also:
foreach($files as $name => $file) {
if (!$file->isDir() AND (strpos($name, $request->course_id.'.zip') === FALSE)){
$zip->addFile($file, str_replace("C:\sites\cnnect-portal\public/storage/app/3","", $file));
}
}