2013-08-01 60 views
2

我想从php脚本下载* .exe文件并执行它。使用C++和Qt下载二进制文件

当我下载文件后,我可以'执行它了。当我查看文件时,其中有很多问号。

PHP脚本:

header('Content-Description: File Transfer'); 
header('Content-Type: application/x-download'); 
header('Content-Disposition: attachment; filename='.basename($file_name)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file_name)); 
ob_clean(); 
flush(); 
readfile($file_name); 
exit; 

C++:

QFile offline_ip_adress_calculator(QDir::currentPath() + "/offline_ip_adress_calculator.exe"); 

    //Check if the File exists and clear its content 
    if(!offline_ip_adress_calculator.open(QFile::ReadWrite | QIODevice::Truncate)) 
    { 
     msgBox.critical(this, "I/O error", "Can't open offline_ip_adress_calculator.exe for update"); 
     return; 
    } 

    QDataStream text_stream(&offline_ip_adress_calculator); 
    while(reply->size() > 0) 
    { 
     QByteArray replystring = reply->read(2048); 
     text_stream << replystring; 
    } 

    offline_ip_adress_calculator.close(); 

的答复是 “QNetworkReply”

回答

2

的问题是,你把二进制数据作为文本。

当您使用QDataStream::operator<<时,来自replystring的数据将像字符串一样处理。但它不是文本字符串,只是一系列字节。

而是使用QNetworkReply::readQFile::write

char buffer[2048]; 
qint64 size = reply->read(buffer, sizeof(buffer)); 
offline_ip_adress_calculator.write(buffer, size); 
+0

哇,太简单了。它的工作原理:) – user2357505

+0

你是如何选择缓冲区为2048?如果文件大于2018字节会发生什么情况? –

+1

@MuhammetAliAsan 2048在计算机方面是一个不错的数字(2的倍数)。如果有更多的数据要读取,它只需要两个(或更多)迭代来读取/写入所有数据。 –

2

这里更加清晰纯净的Qt解决方案:

QByteArray downloadedData = reply->readAll(); 
    QFile file("somefile"); 
    file.open(QIODevice::ReadWrite); 
    file.write(downloadedData.data(),downloadedData.size()); 
    file.close(); 

我已经试过@ SomeProgrammerDude的solution.I下载的PNG文件那样,只得到了图像的上半部分,并且不奇怪,文件大小恰好是2048或我设置的任何数字。