Reputation: 153
I have a WordPress site where users are gonna be able to download one, or multiple pdf files. So far I just coded without using any WordPress functionalities and with having the files on my computer. But in the future, I want to be able to add a file using Advanced Custom Fields (or something similar) which means that I won't have the files in a folder and will have to use URL's instead. At least I think? And when I use the same code, but with URL's (see below), it doesn't work.
So how can I create a zip file from a URL using ZipArchive?
<?php
if(isset($_POST['createzip']))
{
$files = $_POST['files'];
$zipname = time().".zip"; // Zip name
$zip = new ZipArchive(); // Load zip library
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
$zip->addFile($file);
}
$zip->close();
// push to download the zip
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
}
?>
<h1> hej här kan du zippa lite filer</h1>
<form name="zips" method="post">
<input type="checkbox" name="files" value="http://www.unstraight.org/wp-content/uploads/2015/08/seger3.jpg">
<p>Seger</p>
<input type="checkbox" name="files" value="http://www.unstraight.org/wp-content/uploads/dlm_uploads/2015/12/Ovningar-medelsvara.pdf">
<p>Övningar </p>
<input type="checkbox" name="files" value="http://www.unstraight.org/wp-content/uploads/2015/07/User-Agreement-.pdf">
<p>Medlemskort </p>
<input type="checkbox" name="files[]" value="men.pdf">
<p>Män och Jämställdhet </p>
<input type="submit" name="createzip" value="Download as ZIP">
</form>
Upvotes: 0
Views: 807
Reputation: 540
You can retrieve the document from the URL and then use ZipArchive::addFromString
.
Documentation: http://php.net/manual/en/ziparchive.addfromstring.php
The code might look something like this:
foreach ($files as $file) {
if(preg_match('/^https?\:/', $file)) {
// Looks like a URL
// Generate a file name for including in the zip
$url_components = explode('/', $file);
$file_name = array_pop($url_components);
// Make sure we only have safe characters in the filename
$file_name = preg_replace('/[^A-z0-9_\.-]/', '', $file_name);
// If all else fails, default to a random filename
if(empty($file_name)) $file_name = time() . rand(10000, 99999);
// Make sure we have a .pdf extension
if(!preg_match('/\.pdf$/', $file_name)) $file_name .= '.pdf';
// Download file
$ch = curl_init($file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$file_content = curl_exec($ch);
curl_close($ch);
// Add to zip
$zip->addFromString($file_name, $file_content);
} else {
// Looks like a local file
$zip->addFile($file);
}
}
Upvotes: 2