2015-01-09 114 views
1

我用這個功能下載數字下載鏈接。 test.zip發送我的瀏覽器,但文件大小未知,當我下載它並打開顯示此錯誤:「存檔是未知格式或損壞」 test.zip文件夾內和download.php內部根目錄。用php下載數字下載鏈接

<?php 

/* Tutorial by AwesomePHP.com -> www.AwesomePHP.com */ 
/* Function: download with resume/speed/stream options */ 

/* 
    Parametrs: downloadFile(File Location, File Name, 
    max speed, is streaming 
    If streaming - movies will show as movies, images as images 
    instead of download prompt 
*/ 

function downloadFile($fileLocation,$fileName,$maxSpeed = 13,$doStream = 
false){ 
    if (connection_status()!=0) return(false); 
    $array = explode('.',$fileName); 
$extension = strtolower(end($array)); 

    /* List of File Types */ 
    $fileTypes['swf'] = 'application/x-shockwave-flash'; 
    $fileTypes['pdf'] = 'application/pdf'; 
    $fileTypes['exe'] = 'application/octet-stream'; 
    $fileTypes['zip'] = 'application/zip'; 
    $fileTypes['doc'] = 'application/msword'; 
    $fileTypes['xls'] = 'application/vnd.ms-excel'; 
    $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; 
    $fileTypes['gif'] = 'image/gif'; 
    $fileTypes['png'] = 'image/png'; 
    $fileTypes['jpeg'] = 'image/jpg'; 
    $fileTypes['jpg'] = 'image/jpg'; 
    $fileTypes['rar'] = 'application/rar';  

    $fileTypes['ra'] = 'audio/x-pn-realaudio'; 
    $fileTypes['ram'] = 'audio/x-pn-realaudio'; 
    $fileTypes['ogg'] = 'audio/x-pn-realaudio'; 

    $fileTypes['wav'] = 'video/x-msvideo'; 
    $fileTypes['wmv'] = 'video/x-msvideo'; 
    $fileTypes['avi'] = 'video/x-msvideo'; 
    $fileTypes['asf'] = 'video/x-msvideo'; 
    $fileTypes['divx'] = 'video/x-msvideo'; 

    $fileTypes['mp3'] = 'audio/mpeg'; 
    $fileTypes['mp4'] = 'audio/mpeg'; 
    $fileTypes['mpeg'] = 'video/mpeg'; 
    $fileTypes['mpg'] = 'video/mpeg'; 
    $fileTypes['mpe'] = 'video/mpeg'; 
    $fileTypes['mov'] = 'video/quicktime'; 
    $fileTypes['swf'] = 'video/quicktime'; 
    $fileTypes['3gp'] = 'video/quicktime'; 
    $fileTypes['m4a'] = 'video/quicktime'; 
    $fileTypes['aac'] = 'video/quicktime'; 
    $fileTypes['m3u'] = 'video/quicktime'; 

    $contentType = $fileTypes[$extension]; 


    header("Cache-Control: public"); 
    header("Content-Transfer-Encoding: binary\n"); 
    header("Content-Type: $contentType"); 

    $contentDisposition = 'attachment'; 

    if($doStream == true){ 
     /* extensions to stream */ 
     $array_listen = array('mp3','m3u','m4a','mid','ogg','ra','ram','wm', 
     'wav','wma','aac','3gp','avi','mov','mp4','mpeg','mpg','swf','wmv','divx','asf'); 
     if(in_array($extension,$array_listen)){ 
      $contentDisposition = 'inline'; 
     } 
    } 

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { 
     $fileName= preg_replace('/\./', '%2e', $fileName, 
substr_count($fileName, '.') - 1); 
     header("Content-Disposition: $contentDisposition; filename=".$fileName); 
    } else { 
     header("Content-Disposition: $contentDisposition; filename=".$fileName); 
    } 

    header("Accept-Ranges: bytes"); 
    $range = 0; 
    $size = filesize($fileLocation); 

    if(isset($_SERVER['HTTP_RANGE'])) { 
     list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']); 
     str_replace($range, "-", $range); 
     $size2=$size-1; 
     $new_length=$size-$range; 
     header("HTTP/1.1 206 Partial Content"); 
     header("Content-Length: $new_length"); 
     header("Content-Range: bytes $range$size2/$size"); 
    } else { 
     $size2=$size-1; 
     header("Content-Range: bytes 0-$size2/$size"); 
     header("Content-Length: ".$size); 
    } 

    if ($size == 0) { die('Zero byte file! Aborting download');} 
    set_magic_quotes_runtime(0); 
    $fp=fopen("$fileLocation","rb"); 

    fseek($fp,$range); 

    while(!feof($fp) and (connection_status()==0)) 
    { 
     set_time_limit(0); 
     print(fread($fp,1024*$maxSpeed)); 
     flush(); 
     ob_flush(); 
     sleep(1); 
    } 
    fclose($fp); 

    return((connection_status()==0) and !connection_aborted()); 
} 

/* Implementation */ 

downloadFile('file/','test.zip',900,false); 

?> 

回答

2

我讀了這個功能的代碼,我解決了這個問題:

1-

$fileLocation = $fileLocation . $fileName; 

$ fileLocation用來讀取文件,但它僅包含文件夾的名字!

2-

$range = str_replace($range, "-", $range); 

str_replace函數替換爲 「 - 」 字符,但不更新$範圍VAR

3-

set_magic_quotes_runtime 

已過時,我調用函數前加檢查!

你可以從我github下載新的代碼;)

1

擺脫文件末尾的?>

如果這不起作用,可以在zip文件的某個地方看到它。

+0

下載鏈接:http://m-behzadfar.ir/shopfile/file.zip感謝名單 – Mohammad

+0

文件工作得很好。我做了一個zip測試,它說一切都很好。我也檢查了裏面的zip文件,也沒問題。 – Ariel