2014-06-12 241 views
1

新的「setPassword」方法不起作用(除非我誤解了它)。ZipArchive :: setPassword沒有爲我新創建的文件設置密碼

這是我的示例代碼:

<?php 
$zipFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'filename.zip'; 
$password = 'P455W0RD'; 

if (file_exists($zipFilePath)) { 
    unlink($zipFilePath); 
} 

$zipArchive = new ZipArchive(); 
$zipArchive->open($zipFilePath, ZipArchive::CREATE); 

if ($zipArchive->setPassword($password)) { 
    echo 'OK' . PHP_EOL; 
} 

foreach (range(1, 10) as $fileNumber) { 
    $zipArchive->addFromString('file' . $fileNumber . '.txt', rand()); 
} 

$zipArchive->close(); 

它可以打印「確定」,在PHP 5.6.0beta3(Debian的測試),但在壓縮文件中沒有密碼 。

我錯過了什麼?

+0

你有沒有把這個回饋給PHP核心開發人員?他們一直在問現在幾個星期的新PHP56功能的測試反饋 –

+0

其實沒有。我一直在想它。我不確定我的代碼是否愚蠢或者它是否是一個真正的bug ... –

+0

也許值得修改代碼以測試setPassword()是否工作_after_添加文件......但它肯定有可能是一個bug:this畢竟是一項新功能,而且我沒有看到任何用於測試的phpt文件setPassword –

回答

0

我找到了一種繞過ZipArchive :: setPassword()方法的方法。我只是寫了一個shell腳本:

#!/bin/bash 
command -v zipcloak && echo "exist" || exit -1; 
command -v expect && echo "exist" || exit -1; 
MYPWD="[password]" 
expect -c ' 
spawn zipcloak [filename] 
expect "*Enter password*" 
sleep 0.1 
send "'"$MYPWD"'\r" 
sleep 0.1 
expect "*Verify password*" 
sleep 0.1 
send "'"$MYPWD"'\r" 
sleep 0.1 
' 

我可以簡單地使用EXEC從我的PHP代碼:

public function encryptZip($filename, $password, $bashdir){ 
    $bash = str_replace('[filename]', $filename, (str_replace('[password]', $password, file_get_contents($bashdir)))); 
    exec($bash); 
} 

它僅Linux服務器,在那裏期待和zipcloak安裝上。

相關問題