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 | クライアント/サーバー | このブログの読者になる | 更新情報をチェックする

PHP の関数での環境情報取得( phpinfo の代替え )

@niftyホームページサービス(LaCoocan)では、phpinfo 関数が使用できないので、代替えの為いろいろな関数で情報を表示しています。

関数での情報取得

以下で使用している主な関数です。

ini_get
get_loaded_extensions
get_declared_classes
ini_get_all

phpversion
php_ini_loaded_file
get_include_path
get_magic_quotes_gpc


実行結果

少し見づらいですが、調査する場合や簡単な確認のとっかかりにはなると思います。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<title>phpinfo の代替え</title>
<style>
* {
	font-size: 12px;
	font-family: "ヒラギノ角ゴPro W6","Hiragino Kaku Gothic Pro W6","メイリオ",Meiryo,"MS Pゴシック",Verdana,Arial,Helvetica,sans-serif;
}

pre {
	white-space: pre-wrap;
	word-wrap: break-word;
}
</style>
</head>
<body style='width:400px;margin:auto;border:1px solid #ccc;padding:12px;'>

<pre>
<?php

	print "PHP version : " . phpversion() . "\n";

	print "php.ini : " . php_ini_loaded_file() . "\n";
	print "include_path : " . get_include_path() . "\n";
	print "get_magic_quotes : " . get_magic_quotes_gpc . "\n";

	print "variables_order : " . ini_get('variables_order') . "\n";
	print "short_open_tag : " . ini_get('short_open_tag') . "\n";
	print "display_errors : " . ini_get('display_errors') . "\n";
	print "display_startup_errors : " . ini_get('display_startup_errors') . "\n";
	print "allow_url_fopen : " . ini_get('allow_url_fopen') . "\n";
	print "allow_url_include : " . ini_get('allow_url_include') . "\n";
	print "max_execution_time : " . ini_get('max_execution_time') . "\n";
	print "post_max_size : " . ini_get('post_max_size') . "\n";
	print "track_errors : " . ini_get('track_errors') . "\n";

	print "<hr>";
	print "<b style='font-size:24;font-weight:bold'>Loaded_extensions</b>\n";

	// コンパイル/ロードされている全てのモジュールの名前を配列として返す
	$target = get_loaded_extensions();
	foreach( $target as $key => $value ) {
		print "$key => $value\n";
	}

	print "<hr>";
	print "<b style='font-size:24;font-weight:bold'>get_declared_classes</b>\n";

	// 定義済のクラスの名前を配列として返す
	$classes = get_declared_classes();
	foreach( $classes as $key => $value ) {
		print "$key => $value\n";
	}

	// $_SERVER
	print "<hr>";
	print "<b style='font-size:24;font-weight:bold'>\$_SERVER</b>\n";

	foreach( $_SERVER as $key => $value ) {
		print "$key => $value\n";
	}

	// $_ENV
	print "<hr>";
	print "<b style='font-size:24;font-weight:bold'>\$_ENV</b>\n";

	foreach( $_ENV as $key => $value ) {
		print "$key => $value\n";
	}

	// すべての設定オプションを得る
	print "<hr>";
	print "<b style='font-size:24;font-weight:bold'>ini_get_all</b>\n";
	$inis = ini_get_all();
	print_r($inis);

?>
</pre>

</body>
</html>




タグ:PHP phpinfo
posted by at 2018-02-19 10:06 | LaCoocan | このブログの読者になる | 更新情報をチェックする

2018年02月18日


MSXML2.(Server)XMLHTTPでファイルをアップロードする

呼び出し側は WSH としての VBScript です。バイナリとしてアップロードするので、CRLF は CRLF のままなので、LF へ変換が必要なファイルやシステムでは、サーバー側で変換する必要があります

PHP ならそのままで問題無いので、わざわざ 通常の POST 仕様にあわせる必要も無いと思います。

VBScript 側のサンプルは Microsoft の サポートオンラインにあるので、IIS ではうまくいくのかとは思うのですが、試してはいません。いずれにしても、IIS に対して行う場合はテストが必要です

テストはさくらインターネットの環境で行っています。PHP は、5.6.32 でした。

いったん PNG 画像をアップロードして、FileZilla でダウンロードして fc /b で比較しましたが問題無く同じものでした。テキストファイルも同じ結果で CRLF のままで返って来ています。ただ、rb wb を rt wt にしてもアップロードされたものは同じでした。ドキュメント通り、Windows の PHP 環境のみで効果があるのかもしれませんが、テストはできていません。

最初記事を書いたころは、MSXML2.XMLHTTP というクライアント用のオブジェクトを使用していましたが、Microsoft 側の変遷で現在は MSXML2.ServerXMLHTTP のほうが信頼性が高いと判断して使用しています。
upload.vbs
' *************************************
' サーバーオブジェクトを使用しています
' *************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' Stream オブジェクト の作成
Set Stream = CreateObject("ADODB.Stream")
' Stream のオープン
Stream.Open
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile "target.png"

' ▼ ご自分の環境に書き換えてください。
Call objHTTP.Open("POST","https://yourdomain/test/put.php",False)

nLen = Stream.Size
data = Stream.Read(nLen)

Call objHTTP.SetRequestHeader("Content-Length",nLen)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(data)

Wscript.Echo objHTTP.responseText
 
' Stream を閉じる
Stream.Close


put.php
<?PHP
header( "Content-Type: text/html; charset=utf-8" );

$id = uniqid();

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "data/{$id}_upload.dat", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


?>
データが保存されました


PHP は utf-8 で書いています。それ以外のキャラクタセットの場合は、http ヘッダに同じように設定しておかないと、XMLHTTP が日本語の変換をできないので注意して下さい。通常通り、使用しているキャラクタセットと http ヘッダを一致させればどのキャラクタセットでも問題ありません。

※ HTML 等の静的ページでは、サーバ側でキャラクタセツトの設定ができない場合は、UTF-8 扱いになってしまいます


 関連する記事

PHP + VBS 分割ダウンロード
バッチ処理的ファイルのコピー
MSXML2.XMLHTTPでファイルをPOSTする
prototype.js の Ajax.Request を使い、FORM を使わずにデータをPOSTする



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

テンプレートでその記事の編集画面に直接リンクする


posted by ニックネームの ニックネーム部分にリンクを作成します。これは、「記事」コンテンツの HTML テンプレートを編集します。( こうしておくと、記事のリライトはとっても楽です )

posted by <a href="https://blog.seesaa.jp/pages/my/blog/article/edit/input?id=<% article.id %>" target="_blank"><% article.nickname %></a> at <% article.createstamp | date_format("%Y-%m-%d %H:%M") -%>


posted by at 2018-02-18 01:47 | Seesaa | このブログの読者になる | 更新情報をチェックする

Seesaaブログのテンプレート内で使用できる page_name 変数を JavaScript で使用する


page_name 変数は、テンプレート内で使用する変数なので、直接は使用できませんが、ヘッド部分に以下のコードを入れておけば後続のスクリプトで使用する事ができます
<script>
var $page_name = '<% page_name %>';
</script>


具体的な使用方法としては、トップページは 'index' になりますので、日付タイトルを以下のようにして非表示にする事ができます。
<script>
if ( $page_name == 'index' ) {
	str="";
	str+="<style> \n";
	str+=".date { display:none; } \n";
	str+="</style> ";
	document.write( str );
}
</script>


あるいは、jQuery が使えるのであれば以下のように動的に追加も可能です。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>

$(function(){

	var style = $("<style>");
	style.text(".date { display:none; }");

	var target = $("head").eq(0);
	style.appendTo(target);

});

</script>


さらに、トップページの記事数を1つにして、未来の当分来ない日付の記事を書き込めは、常に表示される「エントランス」を作成できます

注) 'tag' というページもあります



posted by at 2018-02-18 01:40 | Seesaa | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します