从bytea图像数组创建一个zip文件

时间:2016-11-14 06:46:31

标签: php

我有一个数组,它存储从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);
?>

0 个答案:

没有答案