braintag

公開してしまう備忘録

boost:asioを使って、ファイルをWebサーバにマルチパートでPOSTしてみる

boost:asioを使って、ファイルをWebサーバにPOSTしてみる
かなり昔に書いたコードです。
HDDの整理中で、誤ってソースを削除しそうなのでここにメモ。

制限

  1. ファイルはカレントディレクトリ
  2. ポートは80固定
  3. ドメインでなく、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;
}