2018年02月19日


MSXML2.XMLHTTPでファイルをPOSTする

MSXML2.XMLHTTPでファイルをアップロードする と対になる処理です。受けるほうは通常と同じで簡単ですが、送るほうは注意すべき点がいくつかあります

まず、送るほうでは日本語を URL エンコードする必要があるので、JavaScript を呼び出して encodeURIComponent を使用しています。( その為、PHP ではデコードされると UTF-8 になるので注意 )

後、http で POST する際の仕様として、http ヘッダに Content-Type として application/x-www-form-urlencoded をセットしています( データサイズは実際ブラウザが行っているのでセットしています。)

VBSCript 側
<JOB>
<SCRIPT language="JScript">
function js(str) {

	return encodeURIComponent( str );

}
</SCRIPT>

<SCRIPT language="VBScript">

' XMLHTTP を作成
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

Call objHTTP.Open("POST","https://yourdomain/test/post.php",False)
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = "data=" & js("日本語をURLエンコードする")
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(strData)
Wscript.Echo objHTTP.responseText

</SCRIPT>

</JOB>


PHP 側
<?php
header( "Content-Type: text/html; charset=utf-8" );
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );

mb_language( "ja" );
mb_internal_encoding("utf-8");

foreach( $_POST as $key => $value ) {
	// $_GET の中には変換前が残る
	$_GET[$key] = $value;
	// $_POST を HTML 埋め込み用変数として使用する
	$_POST[$key] = htmlentities( $value );
}

if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {

	// ファイルへ入力されたデータを書き込み
	file_put_contents( "text.dat", mb_convert_encoding( $_GET['data'], "shift_jis", "utf-8" ) );

	print "POST処理を受付けました";

}

?>
<form method="post">
<input type="text" name="data" value="<?= $_POST["data"] ?>">
<input type="submit" name="send" value="送信">
</form>





posted by at 2018-02-19 17:57 | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする