[英]PHP Dynamically Generated Zip File by ZipArchive Can't be Opened
我正在嘗試創建用戶上傳的圖像的zip文件,當用戶單擊按鈕時,將生成該文件供下載。 該按鈕位於Wordpress管理員的頁面上。 該頁面來自添加了新管理部分的插件。 單擊該按鈕時,它將表單提交到“ themes / twentyfourteen / page-templates”目錄中的頁面。 該頁面稱為cartoon_zip.php,是通過管理員中“頁面”部分創建的,因此其網址為http://www.sitename.com/cartoon-zip/ 。 當我單擊該文件時,它似乎可以工作。 沒有錯誤發生,並且出現保存文件對話框。 我將文件保存在本地並嘗試解壓縮,但收到消息“此程序無法提取文件“ characters.zip”的內容。 我在Mac電腦上,因此是Unarchiver試圖打開的文件; 但是它在PC上也不起作用。 下面是我正在使用的代碼; 任何幫助是極大的贊賞。
<?php
/*
Template name: Cartoon Zip
*/
if(isset($_REQUEST['order_id'])){
$order_id = $_REQUEST['order_id'];
$query = "SELECT optional_image FROM order_listing WHERE order_no = '".$order_id."'";
$query2 = "SELECT main_image FROM character_order WHERE order_id = '".$order_id."'";
$entries = $wpdb->get_results($query);
$entries2 = $wpdb->get_results($query2);
$error = ""; //error holder
if(extension_loaded('zip')){ // Checking ZIP extension is available
$zip = new ZipArchive(); // Load zip library
$zip_name = "characters.zip"; // Zip name
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){ // Opening zip file to load files
$error .= "* Sorry ZIP creation failed at this time<br/>";
}
foreach( $entries as $entry ) {
$image=$entry->optional_image;
if(!empty($image)):
$url = 'wp-content/themes/twentyfourteen/upload/main/'.$image;
if(file_exists($url)){
$zip->addFile($url,$image); // Adding files into zip
}
endif;
}
foreach( $entries2 as $entry ) {
$image=$entry->main_image;
if(!empty($image)):
$url = 'wp-content/themes/twentyfourteen/upload/character/'.$image;
if(file_exists($url)){
$zip->addFile($url,$image); // Adding files into zip
}
endif;
}
if ($zip->close() === false) {
exit("Error creating ZIP file");
};
$filename = $zip_name;
// send $filename to browser
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $filename);
$size = filesize($filename);
$name = basename($filename);
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
// cache settings for IE6 on HTTPS
header('Cache-Control: max-age=120');
header('Pragma: public');
} else {
header('Cache-Control: private, max-age=120, must-revalidate');
header("Pragma: no-cache");
}
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // long ago
header("Content-Type: $mimeType");
header('Content-Disposition: attachment; filename="' . $name . '";');
header("Accept-Ranges: bytes");
header('Content-Length: ' . filesize($filename));
readfile($fullFilePath);
exit;
}else
$error .= "* You dont have ZIP extension<br/>";
}
?>
編輯:因此,我希望通過結合以下doublesharp的幫助並通過將標題更改為以下內容來使其工作。
$file = $zip_name;
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
這是完整的工作代碼。
<?php
/*
Template name: Cartoon Zip
*/
if(isset($_REQUEST['order_id'])){
global $wpdb;
$order_id = isset( $_REQUEST['order_id'] )? $_REQUEST['order_id'] : 0;
$query = $wpdb->prepare( "SELECT optional_image FROM order_listing WHERE order_no = %s", $order_id );
$query2 = $wpdb->prepare( "SELECT main_image FROM character_order WHERE order_id = %s", $order_id );
$entries = $wpdb->get_results($query);
$entries2 = $wpdb->get_results($query2);
$error = ""; //error holder
if(extension_loaded('zip')){ // Checking ZIP extension is available
$zip = new ZipArchive(); // Load zip library
$zip_name = "characters.zip"; // Zip name
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){ // Opening zip file to load files
$error .= "* Sorry ZIP creation failed at this time<br/>";
}
foreach( $entries as $entry ) {
$image=$entry->optional_image;
if( ! empty( $image ) ){
$filename = WP_CONTENT_DIR.'/themes/twentyfourteen/upload/main/'.$image;
if ( file_exists( $filename ) ){
// Adding files into zip
$zip->addFile( $filename, $image );
}
}
}
foreach( $entries2 as $entry ) {
$image=$entry->main_image;
if( ! empty( $image ) ){
$filename = WP_CONTENT_DIR.'/themes/twentyfourteen/upload/character/'.$image;
if ( file_exists( $filename ) ){
// Adding files into zip
$zip->addFile( $filename, $image );
}
}
}
if ($zip->close() === false) {
exit("Error creating ZIP file");
};
$file = $zip_name;
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
}else
$error .= "* You dont have ZIP extension<br/>";
}
?>
addFile()
的第一個參數需要是圖像的完整路徑,但是您正在使用wp-content/...
的相對路徑。 此頁面的模板很可能在您的wp-content/themes/
目錄中,因此對file_exists()
的調用失敗,這意味着沒有任何內容傳遞給ZipArchive
。 WordPress提供了一個常量,其中包含一個名為WP_CONTENT_DIR
的wp-content
文件夾的絕對路徑-如果您不確定要使用的主題,則可以使用get_template_directory()
。
使用WP_CONTENT_DIR
:
if( ! empty( $image ) ){
$filename = WP_CONTENT_DIR.'/themes/twentyfourteen/upload/character/'.$image;
if ( file_exists( $filename ) ){
// Adding files into zip
$zip->addFile( $filename, $image );
}
}
使用get_template_directory()
:
$filename = get_template_directory().'/upload/character/'.$image;
SQL注射警告
您還存在一個SQL注入漏洞,可以在請求的order_id
中傳遞任意SQL。 使用$wpdb->prepare()
進行保護。
global $wpdb;
$order_id = isset( $_REQUEST['order_id'] )? $_REQUEST['order_id'] : 0;
$query = $wpdb->prepare( "SELECT optional_image FROM order_listing WHERE order_no = %s", $order_id );
$query2 = $wpdb->prepare( "SELECT main_image FROM character_order WHERE order_id = %s", $order_id );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.