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