2012-12-01 97 views
2

我之前使用php輸出緩衝來創建數據庫中的csv文件,因爲我不想創建現有文件,只是想讓內容可下載。PHP輸出緩衝(ob_start,ob_flush)

CSV是基於文本的文件,因此很容易以這種方式創建,您可以設置標題並清除文本內容。但!如果我想從十六進制數據創建一個exe文件呢? (該項目是:我有一個現有的exe文件,我希望用戶可以在HTML文本框中寫入內容,並將其轉換爲十六進制並將舊文本交換到新文件)

謝謝。

+0

你知道在什麼範圍內的字節你想覆蓋的exe文件?我做的是 – piotrekkr

+0

。它總共約100-200字節 – Iburidu

回答

1

如果你想從100字節你可以使用substr()和str_pad()第200字節替換二進制文件的一部分,例如:

$binFile = file_get_contents('/pathto/exec/file.exec'); 
$replacedBinFile = substr($binFile, 0, 100) . str_pad(substr($_POST['text'], 0, 100), 100, "\x00") . substr($binFile, 200); 
file_put_contents('/pathto/exec/file_replaced.exec', $replacedBinFile); 
+0

並不是有可能從我的數據庫(而不是從EXE)讀取所有的十六進制數據,我創建一個字符串並將其刷新到EXE? – Iburidu

+0

Php substr()是二進制安全的並且對不是字符的字節進行操作。在PHP中的字符串也是一個字節序列。因此,如果它是一個PHP字符串,那麼從您擁有數據的位置無關緊要。它可以來自數據庫,$ _POST,xml等等。我不明白「十六進制數據」是什麼意思。你能解釋更多嗎? – piotrekkr

3

使用下面的代碼從硬盤讀取下載exe文件。

<?php 
$file = 'test.exe'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
} 
+0

謝謝,我會在幾天內測試:)) – Iburidu

+0

它的一個工作代碼,我用它在我的項目中。 –

+0

但它是基於十六進制的?因爲我必須替換字節。 – Iburidu