邮件附加.zip扩展名后附加代码

时间:2015-01-27 13:54:28

标签: php

我想打包一个文件夹然后下载。打包文件已创建,但是文件名后面附加了一个代码,因此当我调用文件进行下载时,它确实存在,因为"物理上"他们有另一个名字。请遵循以下代码:

function zip($source, $destination){
    if (!extension_loaded('zip') || !file_exists($source)) {
        return false;
    }

    $zip = new ZipArchive();
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
        return false;
    }

    $source = str_replace('\\', '/', realpath($source));

    if (is_dir($source) === true)
    {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file)
        {
            $file = str_replace('\\', '/', $file);

            // Ignore "." and ".." folders
            if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
                continue;

            if (is_dir($file) === true)
            {
                $zip->addEmptyDir(str_replace($source . '/', '', $file));
            }
            else if (is_file($file) === true)
            {

                $str1 = str_replace($source . '/', '', '/'.$file);
                $zip->addFromString($str1, file_get_contents($file));

            }
        }
    }
    else if (is_file($source) === true)
    {
        $zip->addFromString(basename($source), file_get_contents($source));
    }

    $zip->close();

    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Type: application/force-download');
    header('Content-Disposition: inline; filename="'.$file_name.'"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($destination));
    header('Connection: close');
    readfile($destination);
    exit();

}

readfile($file_name)正在调用filename.zip但实际名称为filename.zip.06452,所以我收到错误。

2 个答案:

答案 0 :(得分:0)

你应该:

header('Content-Length: ' . filesize($destination));

readfile($destination);

因为那是你写档案的地方:

if (!$zip->open($destination, ZIPARCHIVE::CREATE)) {
...

答案 1 :(得分:0)

我得到了解决方案!这个包含在末尾myfile.zip.das87的代码的文件是一个临时文件,php在启动包进程时创建,完成时它们将其重命名为myfile.zip。我打印了错误消息并获得Renaming temporary file failed,因此问题在于文件夹权限。 感谢所有尝试过的人。