在用php创建zip文件时,我得到了两个文件,而不是一个

在用php创建zip文件时,我得到了两个文件,而不是一个,php,file-extension,php-zip-archive,Php,File Extension,Php Zip Archive,我正在努力实现一个简单的PHP功能:创建一个包含一些文件的ZIP存档 问题是,它不仅创建了一个名为filename.zip的文件,还创建了两个名为filename.zip.a07600和filename.zip.b07600的文件。请。请参见以下屏幕截图: 这两个文件的大小非常完美,我甚至可以将它们重命名为filename.zip,并将其解压缩,而不会出现任何问题 有人能告诉我出了什么问题吗 function zipFilesAndDownload_Defect($archive_file_n

我正在努力实现一个简单的PHP功能:创建一个包含一些文件的ZIP存档

问题是,它不仅创建了一个名为filename.zip的文件,还创建了两个名为filename.zip.a07600和filename.zip.b07600的文件。请。请参见以下屏幕截图:

这两个文件的大小非常完美,我甚至可以将它们重命名为filename.zip,并将其解压缩,而不会出现任何问题

有人能告诉我出了什么问题吗

function zipFilesAndDownload_Defect($archive_file_name, $archiveDir, $file_path = array(), $files_array = array()) {
    // Archive File Name
    $archive_file = $archiveDir."/".$archive_file_name;
    // Time-to-live
    $archiveTTL = 86400; // 1 day
    // Delete old zip file
    @unlink($archive_file);
    // Create the object
    $zip = new ZipArchive();
    // Create the file and throw the error if unsuccessful
    if ($zip->open($archive_file, ZIPARCHIVE::CREATE) !== TRUE) {
        $response->res = "Cannot open '$archive_file'";
        return $response;
    }
    // Add each file of $file_name array to archive
    $i = 0;
    foreach($files_array as $value){
        $expl = explode("/", $value);
        $file = $expl[(count($expl)-1)];
        $path_file = $file_path[$i] . "/" . $file;
        $size = round((filesize ($path_file) / 1024), 0);
        if(file_exists($path_file)){
            $zip->addFile($path_file, $file);
        }
        $i++;
    }
    $zip->close();  
    // Then send the headers to redirect to the ZIP file
    header("HTTP/1.1 303 See Other"); // 303 is technically correct for this type of redirect
    header("Location: $archive_file");
    exit;
}
调用函数的代码是一个带有开关盒的文件。。。它本身由一个ajax调用调用:

case "zdl":
    $files_array = array();
    $file_path = array();
    foreach ($dbh->query("select GUID, DIRECTORY, BASENAME, ELEMENTID from SMDMS where ELEMENTID = ".$osguid." and PROJECTID = ".$osproject.";") as $subrow) {
        $archive_file_name = $subrow['ELEMENTID'].".zip";
        $archiveDir = "../".$subrow['DIRECTORY'];
        $files_array[] = $archiveDir.DIR_SEPARATOR.$subrow['BASENAME'];
        $file_path[] = $archiveDir;
    }
    zipFilesAndDownload_Defect($archive_file_name, $archiveDir, $file_path, $files_array);
break;
还有一个代码。。。我尝试将最新的123456.zip.a01234文件重命名为123456.zip,然后使用以下函数取消旧的123456.zip.a01234(以及以前添加的所有.a01234文件)的链接:

function zip_file_exists($pathfile){
    $arr = array();
    $dir = dirname($pathfile);
    $renamed = 0;
    foreach(glob($pathfile.'.*') as $file) {
        $path_parts = pathinfo($file);
        $dirname = $path_parts['dirname'];
        $basename = $path_parts['basename'];
        $extension = $path_parts['extension'];
        $filename = $path_parts['filename'];
        if($renamed == 0){
            $old_name = $file;
            $new_name = str_replace(".".$extension, "", $file);
            @copy($old_name, $new_name);
            @unlink($old_name);
            $renamed = 1;
            //file_put_contents($dir."/test.txt", "old_name: ".$old_name." - new_name: ".$new_name." - dirname: ".$dirname." - basename: ".$basename." - extension: ".$extension." - filename: ".$filename." - test: ".$test);
        }else{
            @unlink($file);
        }
    }
}
简而言之:复制有效,重命名无效,“取消链接”-根本不起作用。。。我现在没主意了…:(

再试一次:我将$zip->getStatusString()的输出放在一个变量中,并将其写入一个日志文件……它生成的日志项是:重命名临时文件失败:没有这样的文件或目录。 但如上图所示,文件43051221.zip.a07200位于zip库临时打开它的目录中


提前感谢您的帮助!

我怀疑您的脚本遇到了PHP脚本超时。PHP zip创建了一个临时文件以压缩到文件名为yourfilename.zip.some_random_的位置。当压缩文件关闭时,该文件将重命名为yourfilename.zip。如果脚本超时,它可能会留在那里。

尝试减少要压缩的文件数,或使用set_time_limit()增加脚本超时


所以,在挣扎了几天之后……事情很简单:

实际上我只在*nix服务器上工作,所以在我的脚本中,我用0777 Perms动态创建了文件夹。我不知道IIS根本不接受这种权限格式

因此,我远程访问服务器,右键单击文件夹文档(所有动态添加的文件和文件夹中最上层的文件夹),并对我找到的所有用户进行完全控制

现在它工作得很完美!!!现在唯一有趣的事情是:这有什么危险吗


感谢您善意的回答…

您是如何调用此函数的?是否在任何循环中调用此函数?谢谢您的好主意。但此函数只调用一次。在其他情况下,如果文件由scandir提供服务,则此函数工作得非常好。在这种情况下,我从数据库中选择文件和路径。感谢您的建议,但这无法实现问题:我使用两个测试用例,一个有2个文件,另一个有4个文件。正如你在上面的截图中所看到的,这些文件的大小约为700 Kb…很有趣。我复制了你的函数,并在本地运行,没有问题。你能分享调用它的代码吗?我在最有趣的事实是,在我在上面的函数中添加了DB功能之前,它已经工作得很好了……具体来说:需要的Windows安全权限是修改。仅仅读写是不够的。