이 함수는 결과 세트 (파일 이름)를 반환하고 사용자가 데스크탑에 저장하도록 압축합니다.천 개 이상의 파일을 압축 할 수 없습니다.
function getFiles() {
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set('zlib.output_compression', 'Off');
$result = null;
$ZIPresult = null;
$cleanup = null;
$output = null;
$fileName = 'SearchResult.zip';
//remove old zip if any
$cleanup = shell_exec("/bin/rm -f SearchResult.zip");
error_log("SHELL OUTPUT=>" . $cleanup, 0);
//test
if (empty($_POST['DBSite'])) { return null; }
$mydir = MYDIR; // set from the CONSTANT
$dir = opendir($mydir);
$DBSite = $_POST['DBSite'];
$getfilename = mysql_query("select /*! SQL_CACHE */ filename from automation_search where site='" . $DBSite . "'") or die(mysql_error());
while ($row = mysql_fetch_array($getfilename)) {
$filename = $row['filename'];
$result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>';
$ZIPresult .= basename($mydir) . '/' . escapeshellarg($filename).' ';
}
if ($result) {
$result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>";
$output = shell_exec("/usr/bin/zip -R SearchResult.zip ". $ZIPresult ." 2>&1 ");
error_log("SHELL OUTPUT=>" . $output, 0);
error_log("ZIP FILENAME=>" . $fileName, 0);
if (file_exists($fileName)) {
//header for forced download
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fileName));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fileName));
ob_clean();
flush();
readfile($fileName);
exit;
}
}
return $result;
}
약 1,000 개 미만의 파일 (약)에서만 작동합니다. 마치 메모리 한도에 도달하고 파일 목록이 화면에 출력되는 것과 같습니다.
오류는 Error.log
에 있습니다. ZIP 파일은 내가
shell_exec("/usr/bin/zip -R SearchResult.zip ". $ZIPresult ." 2>&1 ");
차이에
shell_exec("/usr/bin/zip SearchResult.zip ". $ZIPresult ." ");
에서 내 우편 명령 줄을 변경 시도 생성되지 않습니다. 내가 뭘 놓치고 있니?
SQL 인수도 함께 이스케이프 처리하십시오. '$ _POST [ 'DBSite']'. – hakre
zip에 대한'shell_exec'가 작동하지 않으면 (반환 값을 엄격하게 검사하여 함수의 매뉴얼 페이지와 비교하십시오), 인수가 너무 많은 문제가 발생할 수 있습니다. 인수에 파일 목록을 전달하는 대신'- @'를 사용하고 한 줄에 하나씩 STDIN을 통해 파일을 전달할 수 있습니다. – hakre