2010-07-08 86 views
0

我有一個表單,用戶可以上傳100 MB的文件,導致上傳延遲,因此我決定首先在表單提交時壓縮圖像,然後將其上傳到服務器,然後在服務器上提取它。使得加載過程降低,因此,對於這一點,我已經使用其被如下的腳本:如何壓縮圖像文件並使用PHP解壓縮?我的代碼產生損壞的提取

<?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個字節並且是腐敗的,即無法查看。

出了什麼問題,此代碼,請指導我

回答

2

我認爲你在這裏混淆了客戶端和服務器端。由於PHP腳本在服務器端執行,因此您無法創建ZIP客戶端。因此,您必須指示您的用戶在提交文件之前壓縮文件,或者使用ie。一個Java小程序在上傳之前爲他們壓縮文件。

+0

如何使用java applet來做到這一點? – 2010-07-08 09:59:11

0
$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

+0

那麼我該怎麼做才能將圖像壓縮出這段代碼呢? – 2010-07-08 09:44:15

+0

您的代碼已經提取了zip文件中的所有文件......這只是解壓縮了您剛剛創建的zip文件,並且該zip文件與某些形式相關的文件完全斷開。請參閱wimvds答案。 – Artefacto 2010-07-08 10:00:25

0

請檢查下面的腳本,它只會從zip文件中提取圖像並排除所有其他文件。就像你可以添加所有其他MIME類型一樣。

<?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(); 
}