2011-12-05 51 views
1

PHP版本5.2.17PHP:下載的二進制文件獲取在最後一個額外的字節(0X0A)

我有下載的二進制文件下面的PHP腳本:用來調用

<?php 

$download_dir = '.'; 
$download_file = $_GET['get']; 

$path = $download_dir.'/'.$download_file; 

if(file_exists($path)) 
{ 
    $size = filesize($path); 

    header('Content-Type: application/x-download'); 
    header('Content-Disposition: attachment; filename='.$download_file); 
    header('Content-Length: '.$size); 
    header('Content-Transfer-Encoding: binary'); 

    readfile($path); 
}else{ 
    echo "<font face=$textfont size=3>"; 
    echo "<center><br><br>The file [<b>$download_file</b>] is not available for download.<br>"; 
} 
?> 

網址這個腳本:

http://myserver/cur/downloads/test.php?get=FooBar_Setup.exe

正在下載作品,但下載的文件附加了一個附加字節(0x0a)。
響應的報頭還示出了內容長度是一個字節比所請求的文件的大小較大的:

HTTP/1.1 200 OK 
Date: Mon, 05 Dec 2011 10:29:32 GMT 
Server: Apache/2.2 
Content-Disposition: attachment; filename=FooBar_Setup.exe 
Content-Length: 1417689 
Content-Transfer-Encoding: binary 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: application/x-download 

在服務器上的文件的大小是字節。

我已覈實filesize($path)返回正確的文件大小。 PHP似乎改變了內容長度標頭filesize($path)+1
我看到這種行爲與兩個不同的文件。

如何獲得將0x0a附加到已下載的二進制文件的預覽信息?

+4

您應該清理該文件名。人們可以使用該腳本下載他們想要的任何文件(包括腳本本身)。 –

+0

嘗試刪除?>或在readfile()函數後添加exit語句。 –

+3

@SebastianPaaskeTørholm非常大的+1。這麼大,我覺得只是點擊+1不足以說明這一點有多重要。 – DaveRandom

回答

6

在關閉?>之後,您很可能會有一個額外的空白行,它將與數據一起回顯。關閉?>在PHP文件的末尾始終是可選的。將它排除在外是防止這類問題的良好做法。

內容長度變化的原因是因爲HTTP服務器(或PHP?)忽略它並添加一個新的匹配實際數據響應,然後將其發送到瀏覽器,所以我認爲您可以離開了。 (如果你設法發送錯誤的內容長度的數據,我發現瀏覽器可能會很很奇怪。)

2

在關閉?>標記後,你的PHP腳本中有一個換行符。這是流浪線突破的來源。

避免這個問題的最好方法就是不要使用關閉?>來避免這個問題(這種方式在SO上作出很多)。 PHP不需要它,它有助於避免這個問題。

1

嘗試的ReadFile後添加退出:

//ob_clean(); 
//flush(); 
readfile($path); 
exit; 

,或者你可以刪除>如果在當前文件只有1 PHP代碼塊:

<?php 

$download_dir = '.'; 
$download_file = $_GET['get']; 

$path = $download_dir.'/'.$download_file; 

if(file_exists($path)) 
{ 
    $size = filesize($path); 

    header('Content-Type: application/x-download'); 
    header('Content-Disposition: attachment; filename='.$download_file); 
    header('Content-Length: '.$size); 
    header('Content-Transfer-Encoding: binary'); 

    readfile($path); 
    exit; 

}else{ 
    echo "<font face=$textfont size=3>"; 
    echo "<center><br><br>The file [<b>$download_file</b>] is not available for download.<br>"; 
} 
0

壓縮也可能會導致額外的字節顯示在下載的文件中。在腳本的頂部,添加:

ini_set("zlib.output_compression", "off"); 

禁用該PHP腳本。或者,或者另外,您可能需要驗證您的Web服務器是否也在爲該腳本壓縮輸出。

相關問題