2015-12-03 76 views
2

几天前我发布了我的代码,现在我正在使用它。我已经获得了随机文件,但是当它们解压缩后它变成zip.cpgz文件。我确信这与我在循环中使用数组的方式有关,但我不太确定如何解决此问题。将随机文件下载为zip

<?php 
//./uploads 
$dir = "./uploads"; 
$nfiles = glob($dir.'*.{aiff}', GLOB_BRACE);  
$n=1; 
while ($n<=10){ 
$n ++; 
$arr[$n] = rand(2, sizeof($nfiles)-1); 
print($arr[$n]); 
print(" "); 
} 


$zip = new ZipArchive(); 
$zip_name = "zipfile.zip"; 
if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE){ 
    $error .= "* Sorry ZIP creation failed at this time"; 
} 

foreach($arr as $file){ 
    $path = "./uploads".$file; 
    $zip->addFromString(basename($path), file_get_contents($path)); 
} 

$zip->close(); 

header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$zip_name); 
readfile('zipfile.zip'); 

?> 

此外,如果你是有点丢在这里是my website我想实现它。 (点击下载按钮)

+0

当我尝试下载链接时,我得到了一个带有21个空文件的zip存档! – RamRaider

+0

顺便说一句 - 您网站上的html无效 - 没有为'upload'链接关闭'a'标签,'

Follow me!'然后是一个额外的伪造标签对在底部... – RamRaider

回答

1

最近帮助另一个用户得到了类似于工作的东西(没有随机选择),您可能会发现以下内容有用。这会搜索某个特定文件扩展名的目录,然后随机选择10个压缩并发送的文件。更改$sourcedir$ext以适应 - 希望它有所帮助。

/* From David Walsh's site - modified */ 
function create_zip($files = array(), $destination = '', $overwrite = false) { 
    if(file_exists($destination) && !$overwrite) { return false; } 
    $valid_files = array(); 
    if(is_array($files)) { 
     foreach($files as $file) if(file_exists($file)) $valid_files[] = $file; 
    } 
    if(count($valid_files)) { 
     $zip = new ZipArchive(); 
     if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) return false; 
     foreach($valid_files as $file) $zip->addFile($file, pathinfo($file, PATHINFO_FILENAME)); 
     $zip->close(); 
     return file_exists($destination); 
    } 
    return false; 
} 
/* Simple function to send a file */ 
function sendfile($filename=NULL, $filepath=NULL){ 
    if(file_exists($filepath)){ 

     if(!is_file($filepath) or connection_status()!=0) return FALSE; 

     header("Cache-Control: no-store, no-cache, must-revalidate"); 
     header("Pragma: no-cache"); 
     header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT"); 
     header("Content-Type: application/octet-stream"); 
     header("Content-Length: ".(string)(filesize($filepath))); 
     header("Content-Disposition: inline; filename={$filename}"); 
     header("Content-Transfer-Encoding: binary\n"); 

     if($file = @fopen($filepath, 'rb')) { 
      while([email protected]($file) and (connection_status()==0)) { 
       print(fread($file, 1024*8)); 
       flush(); 
      } 
      @fclose($file); 
     } 
     return((connection_status()==0) and !connection_aborted()); 
    } 
} 



/* Select a random entry from the array */ 
function pick($arr){ 
    return $arr[ rand(0, count($arr)-1) ]; 
} 

/* The directory to which the zip file will be written before sending */ 
$target=__DIR__.'\zipfile.zip'; 

/* The directory you wish to scan for files or create an array in some other manner */ 
$sourcedir = 'C:\Temp\temp_uploads'; 

/* File extension to scan for */ 
$ext='txt'; 

/* Placeholder to store files*/ 
$output=array(); 

/* Scan the dir, or as mentioned, create an array of files some other way */ 
$files=glob(realpath($sourcedir) . DIRECTORY_SEPARATOR . '*.'.$ext); 


/* Pick 10 random files from all possible files */ 
do{ 
    $rnd=pick($files); 
    $output[ $rnd ] = $rnd; 
}while(count($output) < 10); 

/* streamline array */ 
$output=array_values($output); 



if($target) { 
    /* Zip the contents */ 
    $result=create_zip($output, $target, true); 

    /* Send the file - zipped! */ 
    if($result) { 
     $res=call_user_func('sendfile', 'zipfile.zip', $target); 
     if($res) unlink($target); 
    } 
} 
+0

你是男人!哇,这使得更有意义的事,显然我的电脑是唯一一个不让我解压缩的东西......它是为你工作吗? –

+0

我可以下载zip文件,但所有21个文件都是空的,现在我得到了'致命错误:最大执行时间超过30秒/ 47行/home/ghostx19/public_html/phDownloader.php' – RamRaider

+0

我应该如何修复这个错误..我道歉,我仍然在学习 –

1

你确定它没有工作吗?我已经卸载了你的zip文件并解压缩了,并且我得到了UploadsX文件。所以我没有得到一个zip.cpgz文件。

+0

woah甜! VVV –