Jump to content
simonGG

problem with identical named images and wireZipFile

Recommended Posts

Hi there,

i want to realize a ZIP download with pageImages but if 2 images have the same name only one is saved in the ZIP.
So i tried to rename the images like this:

foreach ($sweepstake_children as $sweepstake_member) 
{
  $member_image   = $sweepstake_member->images->first();
  $ext            = $member_image->ext;
  $newFilename    = $sweepstake_member->vorname . "-" . $sweepstake_member->nachname . "-" . $member_image->name. "." . $ext;
  $member_image->rename($newFilename);
}

But then i get an error: Call to a member function rename() on boolean ? Or ist this the wrong approch anayway?

best regards
Simon

Share this post


Link to post
Share on other sites

Do you use ZipArchive to build the zipfile? The method addFile may take more than a single argument:

https://www.php.net/manual/en/ziparchive.addfile.php

The first is the full path to the real, uncompressed file on disk, the (optional) second parameter is the name inside the zipfile. I'd simply specify something unique for the second argument then.

Edit: Ok, just realized you're referring to wireZipFile so probably not helpful.

Share this post


Link to post
Share on other sites
10 hours ago, simonGG said:

But then i get an error: Call to a member function rename() on boolean ?

Probably one of the $sweepstake_children doesn't have any images.

10 hours ago, simonGG said:

So i tried to rename the images

Probably best not to rename the images within the page because that results in the loss of potentially useful filename data and would break any links to the images within CKEditor fields.

Instead you could copy the files to a temporary directory, renaming them in the process, then create the zip and download from there.

Here is some code you can adapt for your purpose:

// Create temp directory
$td = $files->tempDir('to-zip');
$td_path = (string) $td;
$files_to_zip = array();
foreach($page->children() as $child) {
	$image = $child->images->first();
    // Continue if no image exists
    if(!$image) continue;
	// Set path including new filename as needed
	$new_path = $td_path . "{$child->id}.{$image->ext}";
	// Copy image to new path
	$success = $files->copy($image->filename, $new_path);
	// Add new path to array
	if($success) $files_to_zip[] = $new_path;
}
// Set destination path for zip file
$zip_path = $td_path . time() . '.zip';
// Create zip file
$success = $files->zip($zip_path, $files_to_zip);
// Send download
if($success) $files->send($zip_path);
// Optionally remove temp directory now rather than waiting for it to automatically expire
$td->remove();

 

  • Like 4

Share this post


Link to post
Share on other sites
4 hours ago, Hurlbert said:

Is this code applicable no matter how many images you have?

In theory yes, but in practice you will hit PHP memory and timeout limits at some point. Just try it and see how you get on.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...