Как заархивировать файл изображения и извлечь его с помощью PHP?Мой код дает поврежденное извлечение - PullRequest
0 голосов
/ 08 июля 2010

У меня есть форма, в которой пользователь может загрузить файл размером 100 МБ, что приводит к задержке загрузки, поэтому я решил сначала заархивировать изображение при отправке формы, а затем загрузить его на сервер и затем извлечь его на сервер. так что процесс загрузки уменьшается, поэтому для этого я использовал скрипт, который выглядит следующим образом:

<?php
$zip = new ZipArchive();
$filename = "newzip.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}
$zip->addFromString("myfile.jpeg", 
"This is the first file in our ZIP, added as 
firstfile.txt.\n");

echo "numfiles: " . $zip->numFiles . "\n";
$zip->close();

$zip1 = zip_open("newzip.zip");
if ($zip1) {
  while ($zip_entry = zip_read($zip1)) {
    $fp = fopen(zip_entry_name($zip_entry), "w");
    if (zip_entry_open($zip1, $zip_entry, "r")) {
      $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
      fwrite($fp,"$buf");
      zip_entry_close($zip_entry);
      fclose($fp);
    }
  }
  zip_close($zip1);
  unlink("newzip.zip");
}
?>

Теперь из приведенного выше кода я извлекаю изображение, но после извлечения размер изображения уменьшается до 61 байта и поврежден, т.е. его нельзя просмотреть.

Что может быть не так с этим кодом, пожалуйста, наведите меня

Ответы [ 3 ]

2 голосов
/ 08 июля 2010

Я думаю, что вы путаете клиента и сервера здесь.Вы просто не можете создать клиентскую сторону ZIP, так как скрипт PHP выполняется на стороне сервера.Таким образом, вы должны либо проинструктировать своих пользователей, чтобы архивировать файлы перед их отправкой, либо использовать ie.Java-апплет для архивации файла перед загрузкой.

0 голосов
/ 08 августа 2017

Пожалуйста, проверьте ниже скрипт, который будет извлекать только изображения из zip-файла и исключать все остальные файлы.Как способы вы можете добавить все другие типы пантомимы.

<?php
$dir = __DIR__;
$extractedFilesDir = $dir . "/images";
$zipFile = $dir . "/image.zip");

$zipFileName = basename($zipFile, '.zip');
$fieDir = $extractedFilesDir . '/' . $zipFileName;
if (class_exists('ZipArchive')) {
    $zip = new ZipArchive;
    $result = $zip->open($zipFile, ZipArchive::CHECKCONS);
    if ($result === TRUE) {
        $noImageFound = true;
        for ($i = 0; $i < $zip->numFiles; $i++) {
            $onlyFileName = $zip->getNameIndex($i);
            $fileType = mime_content_type('zip://' . $zipFile . '#' . $onlyFileName);
            $fileType = strtolower($fileType);
            if (($fileType == 'image/png' || $fileType == 'image/jpeg' || $fileType == 'image/gif' || $fileType == 'image/svg') && (preg_match('#\.(SVG|svg|jpg|jpeg|JPEG|JPG|gif|GIF|png|PNG)$#i', $onlyFileName))) {
                //copy('zip://' . $zipFile . '#' . $onlyFileName, $fieDir . '/' . $onlyFileName);
                $zip->extractTo($extractedFilesDir, array($zip->getNameIndex($i)));
                $noImageFound = false;
                echo 'extracted the image ' . $onlyFileName . ' from ' . $zipFile . ' to ' . $fieDir . '<br />';
            }
        }
        if ($noImageFound) {
            echo 'There is no images in zip file ' . $zipFile . '<br />';
        }
    } else {
        switch ($result) {
            case ZipArchive::ER_NOZIP:
                echo 'Not a zip archive ' . basename($zipFile);
            case ZipArchive::ER_INCONS:
                echo 'Consistency check failed ' . basename($zipFile);
            case ZipArchive::ER_CRC:
                echo 'checksum failed ' . basename($zipFile);
            default:
                echo 'Error occured while extracting file ' . basename($zipFile);
        }
    }
    $zip->close();
}
0 голосов
/ 08 июля 2010
$zip->addFromString("myfile.jpeg", 
"This is the first file in our ZIP, added as 
firstfile.txt.\n");

Возможно, вы хотели вместо этого:

$zip->addFromString("firstfile.txt", 
"This is the first file in our ZIP, added as 
firstfile.txt.\n");

Получаемый 61-байтный файл - это тот, который вы добавили в первую очередь!

echo strlen("This is the first file in our ZIP, added as 
firstfile.txt.\n");

дает 61.

...