php POST送信時の「Content-type not specified assuming application/x-www-form-urlencoded」エラー

phpでフォームを使わずに直接POST送信したら
「Content-type not specified assuming application/x-www-form-urlencoded」
というエラーが出たのでコードを修正した際のメモ。

これはデータ送信する際のheaderが足りない!という内容のエラーらしい。エラー前は↓のような感じでメソッドタイプとデータを渡してPOSTした。

$data =array(
	'param1' => $param1,
	'param2' => $param2
);
					
$data = http_build_query($data, "", "&");
					
$options =array(
	'http' =>array(
			'method' => 'POST',
			'content' => $data
		)
	);

$contents =file_get_contents($url, false, stream_context_create($options));

修正後は、$optionsの配列にヘッダーを設定。こうすることでエラーが無くなり無事送信完了。

$data =array(
	'param1' => $param1,
	'param2' => $param2
);
					
$data = http_build_query($data, "", "&");

$header = array(
		"Content-Type: application/x-www-form-urlencoded",
		"Content-Length: ".strlen($data)
	);
					
$options =array(
	'http' =>array(
			'method' => 'POST',
			'header' => implode("\r\n", $header),
			'content' => $data
		)
	);

$contents =file_get_contents($url, false, stream_context_create($options));



ファイルアップロードクラスで任意のフィールドのアップロード状態をチェックする

 CodeIgniterを使ったフレームワークで、複数のファイルアップロードフィールドを作った場合、アップロード実行メソッドを「$this->upload->do_upload()」としてしまうと全てのフィールドがチェック対象になってしまう。

 ファイル参照があったフィールドだけアップロードチェックを行いたい場合はどうしたら良いか。

 調べたらdo_uploadメソッドの引数にフィールド名を入れれば良いだけだった。

 とっても簡単。

$config["upload_path"] = "./image/";
$config["allowed_types"] ="gif|jpg|png";
$config["max_size"] ="100";
$config["max_width"] ="1024";
$config["max_height"] ="768";
		
$this->upload->initialize($config);
if(!$this->upload->do_upload("フォームの対象フィールド名"))
{
	// エラー処理
}
else
{
	// 成功!
}

アップロードフィールドが沢山ある場合はフィールド名を値とした配列を使ってforeachでブンブンまわし、オリジナルのチェック関数を通してチェック処理を行えば管理がスムーズになる。

フィールドに値がセットされているかどうかは、スーパーグローバル変数「$_FILES」を使って判断すればok。

$fields = array("file_up1", "file_up2", "file_up3");
foreach($fields as $field)
{
	// _upload_check_fncはフィールド名を引数に渡すと、
	// 上記のファイルアップロード処理を実行するオリジナル関数
	$this->_upload_check_fnc($field);
}

ところで、このCodeIgniterのファイルアップロードクラス、アップロードしたファイル名を任意に決めるような機能がなさそうなんだけど、やっぱ無いんだろうか。

仕方ないので同じファイル名があった場合は、連番をつける設定にしてファイルをアップロードし、サーバーにファイルをアップロード後、任意の名前にリネームした。なんかスマートでないけど好きなファイル名にする場合はこんな感じにするしかない?