需要帮助处理ZIP文件

时间:2010-11-15 23:34:01

标签: php zip

这是我的情景:

  • 我上传了一个zip文件
  • 检查zip文件中的每个文件
  • 如果是文件!=图像,则将文件移至目的地
  • if file == image,调整图片大小并移至目的地

我用Google搜索并查看了不同的解决方案,但没有人可以在将文件保存到最终目的地之前处理文件。

这是我到目前为止的功能:

  // Extract zip file and return files in an array. 
  private function processZip() {
    $zip = new ZipArchive;    
    $tmp_dir = FB_PLUGIN_DIR.'tmp/';

    // Extract files to tmp dir
    if ($zip->open($this->file['tmp_name']) === TRUE) {
      //Check if temp dir exists. If not, create one.
      if (!is_dir($tmp_dir)) {
        mkdir($tmp_dir, 0700);
      }

      $zip->extractTo($tmp_dir);
      $zip->close();

    /* Process extracted files */ 

    foreach(glob($tmp_dir.'*.*') as $filename) {

        // Somehow get MIME type here without using 'finfo' and 'mime_content_type'
        // I haven't installed PEAR and 'mime_content_type' is decapricated.
    }      

      return '1'; // success
    } else {
      return "0"; // fail
    } 
  } 

我不确定我是否朝着正确的方向前进。不知怎的,我认为我应该能够在“ZIP循环”中处理文件。

有没有办法可以读取ZIP文件中的文件,确定MIME类型然后处理文件?

我找到了这个例子:http://www.java-samples.com/showtutorial.php?tutorialid=985
我认为它接近我需要的东西。但不确定要修改什么。

2 个答案:

答案 0 :(得分:1)

解耦您的流程。首先从ZIP文件中提取所有内容,然后扫描文件中的图像文件并进行处理。

这是一个更简单的过程,可以更容易地分解以处理更大的zipfiles。

答案 1 :(得分:0)

以下是我过去如何处理zip文件而不提取整个内容

$zip = new ZipArchive;
$zip->open($file);
for ($i = 0; $i < $zip->numFiles; $i++) {
    $entry = $zip->statIndex($i);
    if ($entry['size'] > 0) {
        $data = $zip->getFromIndex($i);
        // $data is a binary string of file data
        // which can be used in GD functions for images
        // and written to a location for regular files

        if (preg_match('/\.jpe?g$/i', $entry['name'])) {
            // JPEG file
        } else {
            // Not a JPEG file :-)
        }
    }
}
$zip->close();

不幸的是,我找不到一种方法来实际读取文件信息而不提取它,所以我已经进行了文件扩展名检测。