2011-04-10 10 views
2

파일 다운로드 스크립트에 문제가 있습니다. 다음 URL의 스크립트를 발견했습니다. http://www.tutorialchip.com/php-download-file-script/ 이 스크립트는 로컬 (wamp 서버)에서 훌륭하게 작동합니다. 하지만 서버에서 일하지 않습니다. 그냥 "download.php? f = Track_01_test.mp3"로갑니다. 이것은 빈 페이지입니다.파일 다운로드 문제 PHP

다운로드 링크를 들어
$download_path = $_SERVER['DOCUMENT_ROOT']."songs/main_songs/" 

, 내가 사용하고 - -

<a href="download.php?f=2008_Track_02_We_Love_Bangladesh.mp3">Track-02-We Love Bangladesh.mp3</a> 

사람이 이것에 대해 좀 도와, 아니면 더 좋은 방법/스크립트를 제안 할 수있는 I 다운로드 경로를 사용하고? 감사.


이것은 다른 스크립트입니다. 이것은 로컬에서도 작동하지만 서버에서는 문제가 발생합니다.

<?php 

############################################################### 
# File Download 1.31 
############################################################### 
# Visit http://www.zubrag.com/scripts/ for updates 
############################################################### 
# Sample call: 
# download.php?f=phptutorial.zip 
# 
# Sample call (browser will try to save with new file name): 
# download.php?f=phptutorial.zip&fc=php123tutorial.zip 
############################################################### 

// Allow direct file download (hotlinking)? 
// Empty - allow hotlinking 
// If set to nonempty value (Example: example.com) will only allow downloads when referrer contains this text 
define('ALLOWED_REFERRER', ''); 

// Download folder, i.e. folder where you keep all files for download. 
// MUST end with slash (i.e. "/") 
//echo ; 
//example link - <a href="download.php?d=main_songs&f=2008_Track_02_We_Love_Bangladesh.mp3">Track-02-We Love Bangladesh.mp3</a> 
define('BASE_DIR',$_SERVER["DOCUMENT_ROOT"].'/songs/'.$_REQUEST['d']); 

// log downloads? true/false 
define('LOG_DOWNLOADS',true); 

// log file name 
define('LOG_FILE','downloads.log'); 

// Allowed extensions list in format 'extension' => 'mime type' 
// If myme type is set to empty string then script will try to detect mime type 
// itself, which would only work if you have Mimetype or Fileinfo extensions 
// installed on server. 
$allowed_ext = array (

    // archives 
    'zip' => 'application/zip', 

    // documents 
    'pdf' => 'application/pdf', 
    'doc' => 'application/msword', 
    'xls' => 'application/vnd.ms-excel', 
    'ppt' => 'application/vnd.ms-powerpoint', 
    'html' => 'application/msaccess', 
    'htm' => 'application/msaccess', 

    // executables 
    'exe' => 'application/octet-stream', 

    // images 
    'gif' => 'image/gif', 
    'png' => 'image/png', 
    'jpg' => 'image/jpeg', 
    'jpeg' => 'image/jpeg', 

    // audio 
    'mp3' => 'audio/mpeg', 
    'wav' => 'audio/x-wav', 

    // video 
    'mpeg' => 'video/mpeg', 
    'mpg' => 'video/mpeg', 
    'mpe' => 'video/mpeg', 
    'mov' => 'video/quicktime', 
    'avi' => 'video/x-msvideo' 
); 



#################################################################### 
### DO NOT CHANGE BELOW 
#################################################################### 

// If hotlinking not allowed then make hackers think there are some server problems 
if (ALLOWED_REFERRER !== '' 
&& (!isset($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper(ALLOWED_REFERRER)) === false) 
) { 
    die("Internal server error. Please contact system administrator."); 
} 

// Make sure program execution doesn't time out 
// Set maximum script execution time in seconds (0 means no limit) 
set_time_limit(0); 

if (!isset($_GET['f']) || empty($_GET['f'])) { 
    die("Please specify file name for download."); 
} 

// Nullbyte hack fix 
if (strpos($_GET['f'], "\0") !== FALSE) die(''); 

// Get real file name. 
// Remove any path info to avoid hacking by adding relative path, etc. 
$fname = basename($_GET['f']); 

// Check if the file exists 
// Check in subfolders too 
function find_file ($dirname, $fname, &$file_path) { 

    $dir = opendir($dirname); 

    while ($file = readdir($dir)) { 
    if (empty($file_path) && $file != '.' && $file != '..') { 
     if (is_dir($dirname.'/'.$file)) { 
     find_file($dirname.'/'.$file, $fname, $file_path); 
     } 
     else { 
     if (file_exists($dirname.'/'.$fname)) { 
      $file_path = $dirname.'/'.$fname; 
      return; 
     } 
     } 
    } 
    } 

} // find_file 

// get full file path (including subfolders) 
$file_path = ''; 
find_file(BASE_DIR, $fname, $file_path); 

if (!is_file($file_path)) { 
    die("File does not exist. Make sure you specified correct file name."); 
} 

// file size in bytes 
$fsize = filesize($file_path); 

// file extension 
$fext = strtolower(substr(strrchr($fname,"."),1)); 

// check if allowed extension 
if (!array_key_exists($fext, $allowed_ext)) { 
    die("Not allowed file type."); 
} 

// get mime type 
if ($allowed_ext[$fext] == '') { 
    $mtype = ''; 
    // mime type is not set, get from server settings 
    if (function_exists('mime_content_type')) { 
    $mtype = mime_content_type($file_path); 
    } 
    else if (function_exists('finfo_file')) { 
    $finfo = finfo_open(FILEINFO_MIME); // return mime type 
    $mtype = finfo_file($finfo, $file_path); 
    finfo_close($finfo); 
    } 
    if ($mtype == '') { 
    $mtype = "application/force-download"; 
    } 
} 
else { 
    // get mime type defined by admin 
    $mtype = $allowed_ext[$fext]; 
} 

// Browser will try to save file with this filename, regardless original filename. 
// You can override it if needed. 

if (!isset($_GET['fc']) || empty($_GET['fc'])) { 
    $asfname = $fname; 
} 
else { 
    // remove some bad chars 
    $asfname = str_replace(array('"',"'",'\\','/'), '', $_GET['fc']); 
    if ($asfname === '') $asfname = 'NoName'; 
} 

// set headers 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Type: $mtype"); 
header("Content-Disposition: attachment; filename=\"$asfname\""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: " . $fsize); 

// download 
// @readfile($file_path); 
$file = @fopen($file_path,"rb"); 
if ($file) { 
    while(!feof($file)) { 
    print(fread($file, 1024*8)); 
    flush(); 
    if (connection_status()!=0) { 
     @fclose($file); 
     die(); 
    } 
    } 
    @fclose($file); 
} 

// log downloads 
if (!LOG_DOWNLOADS) die(); 

$f = @fopen(LOG_FILE, 'a+'); 
if ($f) { 
    @fputs($f, date("m.d.Y g:ia")." ".$_SERVER['REMOTE_ADDR']." ".$fname."\n"); 
    @fclose($f); 
} 

?> 
+0

당신이 이러한 상황에 도움이되는 몇 가지 더 많은 코드를 제공 할 수 및 더 로컬 서버에서 작동하지만 다른 서버에서 작동하지 않는 방법에 대한 자세한 비교는 무엇입니까? 에서와 마찬가지로 주요 차이점은 무엇이며 어디에서 코드가 발생하고 있습니까? – David

+0

php가 서버의 지정된 디렉토리에있는 파일을 열 수 있는지 확인 했습니까? – rzetterberg

+0

어떻게 확인할 수 있습니까? 내 질문에 몇 가지 코드를 추가했습니다. 한번 봐주세요. –

답변

1

귀하의 코드는 suppress errors operator (@)을 남용하고 기본적으로 뭔가가 실패 할 때 빈 페이지를 표시하기 위해 서버를 지시되도록 오류를보고 할 다른 방법을 제공하지 않습니다. 또한 지시어를 off으로 설정하면 PHP는 다른 종류의 문제가있는 경우 자동으로 종료됩니다.

내 조언은 다음 오류 메시지를 볼 수 있도록

error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 

< 2>는 @ 연산자를 제거

< 1> 상단 또는 스크립트에 전체 오류보고를 사용합니다.

< 3>에 오류가있는 경우 대체 출력을 제공 : (경우에 우리는 해당 스크립트에 익숙하지 않은)

if ($f) { 
    // ... 
}else{ // <-- Add one of this 
    // Do something if there's an error: print it on screen, log it... 
} 
+0

나는 당신의 지시에 따라 일을 행했으며 거의 ​​운이 없게되었습니다. 일부 파일이 다운로드 중입니다. 그러나 최대치는 그렇지 않습니다. 표시 중 - "파일이 없습니다. 올바른 파일 이름을 지정했는지 확인하십시오." 내 메인 사이트 - http://celebratinglifebd.com/download-songs.php를 볼 수 있습니다. 노래를 다운로드하십시오. 첫 번째 다운로드는 있지만 두 번째 다운로드는 수행하지 않습니다. 필자가 제공 한 파일 이름은 정확합니다. 그래서 File이 존재하지 않는 이유를 이해하지 못합니다. –

+0

파일 이름이 * 정확하지 않기 때문에 가능성이 큽니다. 유닉스는 대소 문자를 구별한다.'song.mp3'는'Song.mp3'과 다르다. –

+0

파일 이름을 소문자로 변경했습니다. 나는 이것이 문제를 해결했다고 생각한다. 고마워. –