boost:asioを使って、ファイルをWebサーバにマルチパートでPOSTしてみる
boost:asioを使って、ファイルをWebサーバにPOSTしてみる
かなり昔に書いたコードです。
HDDの整理中で、誤ってソースを削除しそうなのでここにメモ。
制限
- ファイルはカレントディレクトリ
- ポートは80固定
- ドメインでなく、IPアドレス
#include <iostream> #include <string> #include <boost/asio.hpp> #include <boost/regex.hpp> #include <boost/lexical_cast.hpp> using namespace std; using namespace boost::asio; int main() { string filename="postfile.bin";//ポストしたいファイル名 string ipaddress="192.168.1.1";//アップしたいサーバのIPアドレス ifstream f(filename.c_str(),ios::in | ios_base::binary); if (!f){ cerr << "ファイルが開けません "<< endl; return -2; } //Content-Lengthに入れるためのファイルサイズの取得 size_t filesize = (size_t)f.seekg(0, std::ios::end).tellg(); f.seekg(0, std::ios::beg); //boost::asioの出番 ip::tcp::iostream s( ipaddress, "80" ); if(s.fail()){ cerr << "Webサーバが応答しません" << endl; return -1; } // 送信 s << "POST /filerecv.htm HTTP/1.1\r\n"; s << "Content-Type: multipart/form-data; boundary=---------------------------7d97d32d00e4\r\n"; s << "Host: "; s << ipaddress; s << ":80"; s << "Content-Length: "; s << dec << filesize + fileheader.length() + filehooter.length(); s << "\r\n"; s << "Connection: Keep-Alive\r\n"; s << "Cache-Control: no-cache\r\n"; // s << "Authorization: Basic **********\r\n"; 認証がある場合 s << "\r\n"; s << "-----------------------------7d97d32d00e4\r\n"; s << "Content-Disposition: form-data; name=\"BinaryCodeFile\"; filename=\""; s << filename; s << "\"\r\n"; s << "Content-Type: application/octet-stream\r\n"; s << "\r\n"; char buffer[1024]; int readsize = 0; while(!f.eof()){ f.read(buffer,sizeof(buffer)); s.write(buffer,f.gcount()); } f.close(); s << "\r\n-----------------------------7d97d32d00e4--\r\n\r\n"; s << flush; // バッファに溜めずに確実にネットワーク送信 // 受信 boost::regex reg("([0-9]{3})"); string line; boost::smatch result; int statuscode = 0; getline(s, line); if(boost::regex_search(line, result, reg)){//ステータスコードがある場合 statuscode = boost::lexical_cast<int>(result.str(1));//数値へ変換 } if(statuscode != 200){ return -3; } return 0; }