2012-09-03 53 views
2

我做了一個小PHP腳本,它應該允許訪問者從我的服務器上下載文件。它的工作方式是使用其中一個文件,獲取基本名稱並將頭文件和文件發送到客戶端。PHP腳本返回index.php而不是文件名

但是,下載文件時,我有時會得到index.php,有時會得到proper_file_name.zip。

我不知道爲什麼它有時會起作用,爲什麼它有時不起作用。任何建議將不勝感激。

這是我的源代碼的相關部分:

// Client requested custom byte range 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    $range = explode('-', substr($_SERVER['HTTP_RANGE'], 6)); 
    $seekStart = intval($range[0]); 

    if ($range[1] > 0) 
    $seekEnd = intval($range[1]); 

    header('HTTP/1.1 206 Partial Content'); 
    header(sprintf('Content-Range: bytes %d-%d/%d', $seekStart, $seekEnd, $size_vfile)); 
} 
else // Set headers for full file 
    header('HTTP/1.1 200 OK'); 

// Get basename of filename 
$filename = basename($filename); 

// Send headers to client 
header('Cache-Control: private'); 
header('Content-Type: application/octet-stream'); 
header("Content-Disposition: attachment; filename=\"$filename\""); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Description: File Transfer'); 
header('Content-Length: '.$file_size); 
header('Accept-Ranges: bytes'); 
+0

我與智者同樣的問題:你可以在jfiddler的請求完成後向我們顯示你返回的頭文件嗎? – Killrawr

+2

你有一個在'$ filename = basename($ filename)中使用的單元變量;' - 請向我們展示pre在這個問題得到解決的情況下解碼代碼。如果'$ filename'是空的,最終會出現這種行爲! –

回答

1

您是否清理文件名?

並非所有瀏覽器都接受所有字符。請注意,「將100%保證中斷,但其他字符會給出問題,您可以通過注意不通過的文件名來找出哪些問題會給您帶來問題

您可能需要清理。$文件名通過去除可能不喜歡任何字符,下面是一些閱讀關於它:http://greenbytes.de/tech/tc2231/

使用str_replace()函數來更改字符它不喜歡

+0

你說得對,這確實是一個文件名相關的問題。我用str_replace過濾'壞'文件名,它現在似乎工作。感謝您的回答! – beta

1

您正在使用基本名稱,這樣你就取決於您的工作目錄。在下載文件之前只需更改到正確的目錄

+0

感謝您的回答,但是當文件名爲index.php時,該文件也會下載,因此服務器顯然會找到該文件。 – beta

相關問題