2011-11-24 58 views
1

我是一個web服務器 上工作,我已經創建訪問http://127.0.0.1:8080頁面閱讀二進制文件和打印的內容(Web服務器)

的問題是,當它發送的文件和HTTP頭 功能其不正確copyig文件..其扔在年底一些grabage ..(我試圖傳遞一個二進制文件,這就是爲什麼使用std :: IOS ::二進制IM) example.bin

My Example bin file 
:) 

下載文件:

My Example bin file 
:)ýýýýÝÝÝÝÝÝÝhjß/ÝÝ 

我的代碼:

// download file http headers 
message_ = "HTTP/1.0 200 OK\r\n" 
      "Cache-Control: public\r\n" 
      "Content-Description: File Transfer\r\n" 
      "Content-Disposition: attachment; filename=example.bin\r\n" 
      "Content-Type: application/zip\r\n" 
      "Content-Transfer-Encoding: binary\r\n\r\n"; 

std::filebuf *pbuf; 
std::ifstream sourcestr; 
long size; 
char * buffer; 

sourcestr.open("example.bin",std::ios::in | std::ios::binary); 
pbuf=sourcestr.rdbuf(); 

size=pbuf->pubseekoff (0,std::ios::end,std::ios::in); 
pbuf->pubseekpos (0,std::ios::in); 

buffer=new char[size]; 

// get file data 
pbuf->sgetn (buffer,size); 

message_ += buffer; 
+0

如果你在一個帶'sendfile'系統調用的系統上(比如Linux),那麼你可能會用它來發送實際的文件數據? –

+0

我使用Windows不是Linux ..在文件末尾的垃圾使我瘋狂:\ – DanR

回答

1

我認爲問題是buffer在'pbuf-> sgetn()'調用後沒有以null結尾。嘗試:

// EDIT: this won't work for reason stated by @Joachim in his answer. 
buffer = new char[size + 1]; 
pbuf->sgetn(buffer, size); 
*(buffer + size) = 0; 

message_ += buffer; 

如果message_std::string沒有NULL終止的替代方案是:

message_.append(buffer, size); 

希望有所幫助。

+0

解決了這個問題..謝謝:) – DanR

0

最大的問題是,要附加一個二進制緩衝區的內容爲字符串。 C++中的字符串由字符'\ 0'終止,這意味着如果二進制文件在中間包含該字符,則「字符串」將終止。如果二進制文件不包含任何'\ 0'字符,將它附加到一個字符串將追加內存,直到找到終止符,這就是你得到額外垃圾的原因。行message_ += buffer僅僅意味着添加由buffer指向的內存,直到找到字符串終止符。

您必須分兩部分發送文件:首先是標題,然後是文件數據。

+0

謝謝你的回答! – DanR