2015-08-22 18 views
1

我试图用PHP解压文件时不断收到failed to open stream: Is a directory错误。ZipArchive:`无法打开流:是一个目录`

这通常是目标路径的问题。

但是,在我的情况下,目标是好的:我可以使用相同的代码解压缩不同的文件,或者解压缩没有PHP的文件。

ZipArchive::extractTo文档没有帮助。此错误消息也没有其他SO线程。


仅供参考,这是一个Q &一个后。


以下是评论中所要求的源代码。我分享Dropbox的链接公开,看到这件事情取决于ZIP输入的格式(ZIP文件/路径,看到答案。)

/** Config **/ 
$url = 'https://www.dropbox.com/sh/nx5792q9syppaoo/AAAJZBWlGNAd_EkmQaFvEwe0a?dl=1'; 

/** Where to save **/ 
$zipped = ABSPATH . 'tmp/updates/dialogues.zip'; /* Keep in mind this is public-facing. */ 
$outputdirectory = ABSPATH . 'tmp/updates/testing'; /* The trailing slash is optinal. */ 

/** Download the dialogues **/ 
echo 'Fetching the dialogues...<br>'; 
if (($dropboxfile = fopen($url, 'r')) === FALSE) { /* == has higher precedent over = */ 
    echo 'FATAL ERROR: could not open Dropbox file.'; 
    die(); 
} else if (file_put_contents($zipped, $dropboxfile) === FALSE) { 
    echo 'FATAL ERROR: could not copy Dropbox file.'; 
    die(); 
} 
echo "Dialogues downloaded as zip OK. (See {$zipped})<br>"; 


/** Unzip the dialogues **/ 
print 'Unzipping...<br>'; 
$zip = new ZipArchive; 
$res = $zip->open($zipped); 
if ($res === TRUE) { 

    // Does not work 
    // $zip->extractTo(ABSPATH . 'tmp/updates/testing'); 

    // Works 
    for($i = 0 ; $i < $zip->numFiles ; $i++) { 
     if ($zip->getNameIndex($i) != '/' && $zip->getNameIndex($i) != '__MACOSX/_') { 
      print $zip->getNameIndex($i) . '<br>'; 
      $zip->extractTo($outputdirectory, array($zip->getNameIndex($i))); 
     } 
    } 

    $zip->close(); 
    print 'Done unzipping.<br>'; 
} else { 
    print 'FATAL ERROR: unzipping failed.'; 
} 
+0

你能告诉我们你的代码吗? –

+0

为什么-1当我试图帮忙? –

+0

我花了15分钟的时间把这个问答放在一起,希望能够在未来挽回某人的某个时间,而我已经有了答案。这并不完全让我想在未来再次分享问答。 –

回答

3

事实证明,我有一个/“文件夹”在ZIP档案里面。

这可以通过命令行浏览ZIP归档来确认。例如,在OS X上,使用unzip -vl dialogues.zip给了我这个:

Archive: dialogues.zip 
Length Method Size Ratio Date Time CRC-32 Name 
-------- ------ ------- ----- ---- ---- ------ ---- 
     0 Defl:N  2 0% 08-22-15 12:07 00000000/
    2154 Defl:N  1064 51% 06-08-15 15:18 602c6793 dialogue001-en.txt 
    ... 
    4379 Defl:N  1793 59% 08-21-15 13:56 75e1ef52 dialogue106-en.txt 
     70 Defl:N  39 44% 08-22-15 12:07 985af458 __MACOSX/_ 
--------   ------- ---       ------- 
    775512   343864 56%       312 files 

该文件从Dropbox的下载和我宁愿能够与它的工作,因为它是。

所以我刚刚结束了过滤包含在ZIP压缩包中的文件列表,决定将其解压任何文件之前:

print 'Unzipping...<br>'; 
$zip = new ZipArchive; 
$res = $zip->open($zipped); 
if ($res === TRUE) { 
    // 
    for($i = 0 ; $i < $zip->numFiles ; $i++) { 
     if ($zip->getNameIndex($i) != '/' && $zip->getNameIndex($i) != '__MACOSX/_') { 
      print $zip->getNameIndex($i) . '<br>'; 
      $zip->extractTo($tempdirectory, array($zip->getNameIndex($i))); 
     } 
    } 
    $zip->close(); 
    print 'Done unzipping.<br>'; 
} else { 
    print 'FATAL ERROR: unzipping failed.'; 
} 

没有看到这个记录任何地方和浪费近一个小时这一点。我希望这会帮助某人。

我还不清楚ZIP文件里面的/引用是否正确。 (评论欢迎。)