使用Zip php常规输入/输出错误创建ODT文件

时间:2014-10-18 20:35:45

标签: php

我的系统会生成一个包含下一个文件和子文件夹的文件夹

enter image description here

我正在使用this code创建一个odt文件。当我使用此代码运行我的系统,通过Apache + PHP和Ubuntu 12.04将子文件夹和文件压缩到test.odt文件时,odt文件就可以了。但是当我尝试通过IIS + PHP和Windows将一个压缩到test.odt文件时,odt文件无效。我知道不行,因为当我用LibreOffice 打开odt文件时,我得到错误输入/输出一般错误。 Here odt文件。

当我提取通过Windows生成的odt文件时,文件夹和文件具有相同的图片形式。我正在寻找谷歌,也许问题是mimetype编码。

我将如何修改代码1以便解决问题?

修改

我使用this folder代码如下,但我的odt文件中只有“PKÜNTEBasic/PKÜNTEúミ,lÓR/ Basic / script-lc.xmleマAoÂ0”。 Here the example

<?php

$wordtemplatedownloadpath = "siscons\\test\\wordtemplatedownload\\";
Zip($wordtemplatedownloadpath . "pasta3", $wordtemplatedownloadpath . "test.odt");
force_download("test.odt", $wordtemplatedownloadpath . "test.odt");
//echo "<a href=test/wordtemplatedownload/test.odt>" . "Download Force". "</a>";
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));
    //echo $source;
    if (is_dir($source) === true) {
        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

        foreach ($files as $file) {
            //print "file#".$file."\n";
            $file = str_replace('\\', '/', $file);

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

            //$file = realpath($file);
            //print "file#".$file."\n";
            if (is_dir($file) === true) {
                //$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                //echo "sourcE".$source."FilE".$file."ReplacE".str_replace($source . '/', '', $file)."End";
                $zip->addEmptyDir(str_replace($source . '/', '', $file));
            } else if (is_file($file) === true) {

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

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

    return $zip->close();
}

function force_download($filename = '', $data = '')
{
    if ($filename == '' || $data == '') {
        return false;
    }

    if (!file_exists($data)) {
        return false;
    }

    // Try to determine if the filename includes a file extension.
    // We need it in order to set the MIME type
    if (false === strpos($filename, '.')) {
        return false;
    }

    // Grab the file extension
    $extension = strtolower(pathinfo(basename($filename), PATHINFO_EXTENSION));

    // our list of mime types
    $mime_types = array(

        'txt' => 'text/plain',
        'htm' => 'text/html',
        'html' => 'text/html',
        'php' => 'text/html',
        'css' => 'text/css',
        'js' => 'application/javascript',
        'json' => 'application/json',
        'xml' => 'application/xml',
        'swf' => 'application/x-shockwave-flash',
        'flv' => 'video/x-flv',

        // images
        'png' => 'image/png',
        'jpe' => 'image/jpeg',
        'jpeg' => 'image/jpeg',
        'jpg' => 'image/jpeg',
        'gif' => 'image/gif',
        'bmp' => 'image/bmp',
        'ico' => 'image/vnd.microsoft.icon',
        'tiff' => 'image/tiff',
        'tif' => 'image/tiff',
        'svg' => 'image/svg+xml',
        'svgz' => 'image/svg+xml',

        // archives
        'zip' => 'application/zip',
        'rar' => 'application/x-rar-compressed',
        'exe' => 'application/x-msdownload',
        'msi' => 'application/x-msdownload',
        'cab' => 'application/vnd.ms-cab-compressed',

        // audio/video
        'mp3' => 'audio/mpeg',
        'qt' => 'video/quicktime',
        'mov' => 'video/quicktime',
        // adobe
        'pdf' => 'application/pdf',
        'psd' => 'image/vnd.adobe.photoshop',
        'ai' => 'application/postscript',
        'eps' => 'application/postscript',
        'ps' => 'application/postscript',

        // ms office
        'doc' => 'application/msword',
        'rtf' => 'application/rtf',
        'xls' => 'application/vnd.ms-excel',
        'ppt' => 'application/vnd.ms-powerpoint',

        // open office
        'odt' => 'application/vnd.oasis.opendocument.text',
        'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
    );

    // Set a default mime if we can't find it
    if (!isset($mime_types[$extension])) {
        $mime = 'application/octet-stream';
    } else {
        $mime = (is_array($mime_types[$extension])) ? $mime_types[$extension][0] : $mime_types[$extension];
    }

    // Generate the server headers
    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
        header('Content-Type: "' . $mime . '"');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header("Content-Transfer-Encoding: binary");
        header('Pragma: public');
        header("Content-Length: " . filesize($data));
    } else {
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false);
        header("Content-Type: " . $mime, true, 200);
        header('Content-Length: ' . filesize($data));
        header('Content-Disposition: attachment; filename=' . $filename);
        header("Content-Transfer-Encoding: binary");
    }
    readfile($data);
    exit;

} //End force_download
?>

1 个答案:

答案 0 :(得分:0)

我使用PClZIP和phpconcept.net/pclzip/faq的Q5,我的脚本现在可以使用了!