2010-10-02 56 views
0

注意:我在本地主机上,所以CHMOD'ing不是答案。将提取的文件从ZIP复制到目录


反正我不能去复制它从一个ZIP到一个目录中提取的文件,这些文件被提取,但他们不会被复制......这些文件只是躺在根文件夹upload.php是。我有这个:

exec('unzip ' . $_FILES['file']['tmp_name'], $ary, $output); 

$img = 0; 

$number = count($ary); 

foreach($ary as $file) 
{ 
    copy($file, 'i/'); 
    unlink($file); 
    $img++; 
} 

echo $img . '/' . $number; 

它输出11/11,这样好...但文件不复制,原始文件不会被删除。为什么不复制它们?

回答

2

问题是假设数组$ary中有文件名。但事实并非如此。

$ary其保持unzip命令的输出将是这样的:

extracting: foo 
extracting: bar 
... 

尝试使用var_dump($ary)以确认此倾倒数组内容。

我的建议是不要使用外部unzip命令,而是使用build in zip functions of PHP为:

$zip = new ZipArchive; 
if ($zip->open("$_FILES['file']['tmp_name']") === TRUE) { 
    $zip->extractTo('i/'); 
    $zip->close(); 
} else { 
    // failed to extract. 
} 
+0

对于一个好的答案+1,虽然可能应该注意ZipArchive是在PHP 4的后续版本中添加的。如果您在旧系统上,可能会被迫仅仅解析shell exec()行的输出。 – stevendesu 2010-10-02 04:07:30

0

正如codaddict已经提到的,尽量PECL压缩模块,或梨File_Archive。 但是,如果你不能安装任何这些,并继续使用旧的PHP,尝试:

exec('unzip ' . $_FILES['file']['tmp_name'] . ' | tail -n"+2" | cut -d" " -f4 ', $ary, $output); 

这应该给你只是文件名。

0

它不会复制文件beause你没有完全阅读手册:

$ DEST - 目标路径。如果$ dest是一个URL,如果包装不支持覆盖现有文件,复制操作可能会失败。 警告:如果目标文件已经存在,它将被覆盖。

您需要指定完整的目标路径(包括文件名),而不仅仅是目录。