以zip方式下载随机文件

时间:2015-12-03 07:49:34

标签: php html random directory

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

 <?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我正试图实现它。 (单击下载按钮)

2 个答案:

答案 0 :(得分: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( !@feof( $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 );
    }
}

答案 1 :(得分:1)

你确定它不起作用吗?我已经下载了你的zip文件并将其解压缩,我得到了UploadsX文件。所以我没有得到zip.cpgz文件。