如何使用ZipArchive保存PHP从DOCX获取的图像

如何使用ZipArchive保存PHP从DOCX获取的图像,php,Php,简介:我有一个Docx文件。我用PHP编写了一个简单的代码,可以提取文件中的图像并显示在页面上 我想要实现的是:我希望这些图像应该以相同的名称和格式保存在我的php文件旁边 我的文件夹有sample.docx,它有图像,extract.php从docx和display.php中提取图像 下面是extract.php的代码 我怎样才能做到这一点?我不确定您是否需要像这样多次打开zip归档文件-特别是当另一个实例已经打开时,但我很想尝试以下方法-我应该强调,它完全没有经过测试 测试后更新: 如果您这

简介:我有一个Docx文件。我用PHP编写了一个简单的代码,可以提取文件中的图像并显示在页面上


我想要实现的是:我希望这些图像应该以相同的名称和格式保存在我的php文件旁边

我的文件夹有sample.docx,它有图像,extract.php从docx和display.php中提取图像

下面是extract.php的代码


我怎样才能做到这一点?

我不确定您是否需要像这样多次打开zip归档文件-特别是当另一个实例已经打开时,但我很想尝试以下方法-我应该强调,它完全没有经过测试

测试后更新: 如果您这样做的话,就没有必要使用display.php——在不同的.docx文件上似乎可以正常工作。$zip->getFromIndex返回的数据生成原始图像数据,因此我发现由于长度原因,无法传递查询字符串。我试图避免不必要地打开/关闭zip存档,因此下面的方法将原始数据添加到输出数组,然后使用此base64编码的数据内联显示图像

<?php    
    #extract.php

    $document = 'sample.docx';

    function readZippedImages($filename) {
        $paths=[];
        $zip = new ZipArchive;
        if( true === $zip->open( $filename ) ) {
            for( $i=0; $i < $zip->numFiles;$i++ ) {
                $zip_element = $zip->statIndex( $i );
                if( preg_match( "([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)", $zip_element['name'] ) ) {
                    $paths[ $zip_element['name'] ]=base64_encode( $zip->getFromIndex( $i ) );
                }
            }
        }
        $zip->close();
        return $paths;
    }
    $paths=readZippedImages( $document );





    /* to display & save the images */
    foreach( $paths as $name => $data ){
        $filepath=__DIR__ . '/' . $name;
        $dirpath=pathinfo( $filepath, PATHINFO_DIRNAME );
        $ext=pathinfo( $name, PATHINFO_EXTENSION );
        if( !file_exists( $dirpath ) )mkdir( $dirpath,0777, true );
        if( !file_exists( $filepath ) )file_put_contents( $filepath, base64_decode( $data ) );

        printf('<img src="data:image/%s;base64, %s" />', $ext, $data );
    }
?>

你忘了提到你的问题了。我希望这些图像应该以相同的名称和格式保存在我的php文件旁边,但我不知道怎么做,这是我的问题。你可以成功地找到图像的文件名/路径吗?因为现在我不将其保存在任何地方,我想这样做,请你指导如果找到图像,保存它,这里的代码是什么-ifpreg\u match[^\s]+\.?ijpg | jpeg | png | gif | bmp$,$zip_元素['name']{嗨,你能分享屏幕并看5分钟吗?也许我可以关闭这个,上面的脚本不起作用。我说它未经测试。当你说不起作用时-发生了什么或没有发生什么?我能分享任何桌面吗?我怀疑你的代码没有读取.docx文件并找到任何图像~昨天应该读得更好。请在没有任何桌面的情况下解释只希望我的文件保存在硬盘上,仅此而已,我的代码显示图片,你的代码不显示也不保存在磁盘上,如果你想在你的环境中测试,我可以提供docx文件吗
<?php
/*Tell the browser that we want to display an image*/
header('Content-Type: image/jpeg');        

/*Create a new ZIP archive object*/
$zip = new ZipArchive;

/*Open the received archive file*/
if (true === $zip->open($_GET['filename'])) {    
/*Get the content of the specified index of ZIP archive*/
echo $zip->getFromIndex($_GET['index']);
}

$zip->close();
?>
<?php    
    #extract.php

    $document = 'sample.docx';

    function readZippedImages($filename) {
        $paths=[];
        $zip = new ZipArchive;
        if( true === $zip->open( $filename ) ) {
            for( $i=0; $i < $zip->numFiles;$i++ ) {
                $zip_element = $zip->statIndex( $i );
                if( preg_match( "([^\s]+(\.(?i)(jpg|jpeg|png|gif|bmp))$)", $zip_element['name'] ) ) {
                    $paths[ $zip_element['name'] ]=base64_encode( $zip->getFromIndex( $i ) );
                }
            }
        }
        $zip->close();
        return $paths;
    }
    $paths=readZippedImages( $document );





    /* to display & save the images */
    foreach( $paths as $name => $data ){
        $filepath=__DIR__ . '/' . $name;
        $dirpath=pathinfo( $filepath, PATHINFO_DIRNAME );
        $ext=pathinfo( $name, PATHINFO_EXTENSION );
        if( !file_exists( $dirpath ) )mkdir( $dirpath,0777, true );
        if( !file_exists( $filepath ) )file_put_contents( $filepath, base64_decode( $data ) );

        printf('<img src="data:image/%s;base64, %s" />', $ext, $data );
    }
?>