2012-12-01 105 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