2011-08-06 20 views
0

だから私は、そのようなコードを試してみてください。http要求の本文文字列からファイル名を取得するには?

std::ofstream myfile; 
myfile.open ("example.txt", std::ios_base::app); 
myfile << "Request body: " << request->body << std::endl << "Request size: " << request->body.length() << std::endl; 

size_t found_file = request->body.find("filename="); 
if (found_file != std::string::npos) 
{ 
    size_t end_of_file_name = request->body.find("\"",found_file + 1); 
    if (end_of_file_name != std::string::npos) 
    { 
     std::string filename(request->body, found_file+10, end_of_file_name - found_file); 
     myfile << "Filename == " << filename << std::endl; 
    } 
} 
myfile.close(); 

をしかし、それは、例えば中出力:

Request body: ------WebKitFormBoundary0tbfYpUAzAlgztXL 

Content-Disposition: form-data; name="datafile"; filename="Torrent downloaded from Demonoid.com.txt" 

Content-Type: text/plain 



Torrent downloaded from http://www.Demonoid.com 

------WebKitFormBoundary0tbfYpUAzAlgztXL-- 


Request size: 265 
Filename == Torrent d 

これは、それがTorrent downloaded from Demonoid.com.txtを返す必要がありながらfilename="Torrent downloaded from Demonoid.com.txt"から私譲るが、ファイル名としてTorrent dをreturnesことを意味します。私のファイルアップロードHTTP要求ファイル名パーサーを修正するには?

答えて

3

string::findは、検索文字列のの最初の文字のインデックスを返します。したがって、それを検索するとにfのインデックスが表示されます。

ラインで

size_t end_of_file_name = request->body.find("\"",found_file + 1); 

あなたは次に

std::string filename(request->body, found_file + 10, end_of_file_name - (found_file + 10)); 

std::string filename(request->body, found_file+10, end_of_file_name - found_file); 

を変更

size_t end_of_file_name = request->body.find("\"", found_file + 9 + 1); // 9 because that's the length of "filename=" and 1 to start at the character after the " 

にそれを変更する必要があります

いつも10を追加することをやめるために別の変数を追加することもできます。

関連する問題