我有一个数组,它存储从Postgresql数据库中检索到的具有bytea数据类型的图像。
我测试了我的代码并成功将一张图片下载到我的电脑
<?php
require_once('database.php');
$db = new Database();
$imageArray = $db->getRandomScrapedImagePack();
header('Content-Disposition: Attachment;filename=image.jpg');
echo pg_unescape_bytea($imageArray[0]);
?>
但$imageArray
包含多个图片。我想从$imageArray
中的所有图像创建一个zip文件,然后下载包含所有图像的zip文件。
如果不首先将图像写入磁盘,这是否可行?如果是这样,我将不胜感激任何有关如何完成的参考。
更新
所以这就是我提出的,但它并没有在服务器上创建zip文件。下载的文件小于1kb,当我尝试解压缩时,我收到错误消息,它不是zip文件
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('database.php');
$db = new Database();
$imageArray = $db->getRandomScrapedImagePack();
$zipname = 'images.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($imageArray as $file) {
$zip->addFile($file);
}
$zip->close();
header('Content-Disposition: Attachment;filename=images.zip');
echo $zip;
?>
更新2
我更新了图像首先保存到磁盘然后再保存到zip文件中。现在奇怪的是,当我通过浏览器运行文件时,没有文件被创建。但是当我通过命令行运行它时它可以正常工作
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('../database.php');
$db = new Database();
$imageArray = $db->getRandomScrapedImagePack();
$imagePathArray = array();
$counter = 0;
foreach($imageArray as $image) {
$imagePath = "photo" . $counter++ .".jpg";
array_push($imagePathArray, $imagePath);
$fp = fopen($imagePath, 'w');
fwrite($fp, pg_unescape_bytea($image));
fclose($fp);
}
$fileName = "images.zip";
//create the archive
$zip = new ZipArchive();
if($zip->open($fileName, ZIPARCHIVE::CREATE)!==TRUE) {
echo "<p style='color:red;'>Sorry ZIP creation failed at this time</p>";
return false;
}
//add the files
foreach($imagePathArray as $path) {
$zip->addFile($path);
}
//close the zip -- done!
$zip->close();
header("Content-Disposition: attachment; filename=\"".$fileName."\"");
readfile($fileName);
?>
更新3
因此,以下代码首先创建zip文件而不将图像写入磁盘。但它只有在我通过命令行运行时才有效。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('../database.php');
$db = new Database();
$imageArray = $db->getRandomScrapedImagePack();
$zipname = 'images.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
$counter = 0;
foreach ($imageArray as $file) {
$zip->addFromString($counter++ . ".jpg", pg_unescape_bytea($file));
}
$zip->close();
header('Content-Disposition: Attachment;filename=images.zip');
readfile($zipname);
?>