SQLの窓

2014年09月05日


PHP : ファイルのアップロード時のデータのダンプ( PHP 5.4.0 以降で利用可能な php://input での取得 / ASP / C# )

PHP での方法

php.ini で、enable_post_data_reading = Off を設定すると、PHP へのPOST データは、php://input で取得する方法が使用できます( PHP 5.4.0 以降で利用可能 )。ヘッダ情報は、apache_request_headers で取得できます。( この関数は PHP のバージョンによっては動作しません )
このオプションを無効にすると、$_POST や $_FILES に値が入らなくなります。 この場合、投稿されたデータを読むには、ストリームラッパー php://input を使う以外の方法はなくなります。 これは、リクエストをプロキシしたり POST データを処理する際のメモリ消費量を抑えたりする際に有用です。
以下はテストコードです。
<?php

$postdata = file_get_contents("php://input"); 
file_put_contents("body.dat", $postdata );

$headers = print_r(apache_request_headers(),true);
file_put_contents("head.txt", $headers);

?>
OK

▼ body.dat
------WebKitFormBoundaryYhPBaYDBSNNO1pBx
Content-Disposition: form-data; name="send"

upload button
------WebKitFormBoundaryYhPBaYDBSNNO1pBx
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryYhPBaYDBSNNO1pBx
Content-Disposition: form-data; name="fileUpload"; filename="001.png"
Content-Type: image/png

バイナリデータ……
バイナリデータ……
バイナリデータ……
------WebKitFormBoundaryYhPBaYDBSNNO1pBx
Content-Disposition: form-data; name="fileUploadTitle"

comment
------WebKitFormBoundaryb80JkuEC8QiLNDst--

ASP での方法

ASP を使うのは、Windows7 では、プロフェッショナル以上が必要だと思いますが、IIS をインストールすれば、比較滝簡単に利用できます。ただ、慣れないうちは管理コンソールが解りにくいのが難点です。

IISのインストール



仮想ディレクトリの作成



仮想ディレクトリを追加して、ディレクトリの参照を有効にすれば、だいたい普通に使えるはずです。

<% Call Response.AddHeader( "Content-Type", "text/html; Charset=shift_jis" ) %>
<form
	method=POST
	enctype=multipart/form-data>
<input type=file name=upload>
<input type=submit name=send value="送信">
</form>
<%
if Request.ServerVariables( "REQUEST_METHOD" ) = "POST" then
 
' ****************************
' オブジェクト作成
' ****************************
	Set Stream = Server.CreateObject("ADODB.Stream")
 
' ****************************
' ストリームオープン
' ****************************
	Stream.Open
 
' ****************************
' Stream タイプの指定
' ****************************
	Stream.Type = 1
 
' ****************************
' raw データの受信と書き込み
' ****************************
	nCount = Request.TotalBytes
	Stream.Write Request.BinaryRead( nCount )
	Stream.SaveToFile Server.MapPath("Post.dat"), 2 

' ****************************
' Stream を閉じる
' ****************************
	Stream.Close
 
end if
%>


以下はその時の HTTP ヘッダです
POST /web/upload/test.asp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, */*
Referer: http://localhost/web/upload/test.asp
Accept-Language: ja
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: multipart/form-data; boundary=---------------------------7da1c519203ca
Accept-Encoding: gzip, deflate
Host: localhost
Content-Length: 78138
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: __csv=cdeb8a0717bcd53; ASPSESSIONIDAQTSTRBR=JHMFJGLDFNIDKMNFDIGBOAEK

データは以下のようになります
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="upload"; filename="1252328628672351.png"
Content-Type: image/x-png

ここにバイナリデータ
ここにバイナリデータ
ここにバイナリデータ
-----------------------------7da1c519203ca
Content-Disposition: form-data; name="send"

送信
-----------------------------7da1c519203ca--



AN HTTPD + C#(VS2010)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace cgi_get_body {
	class Program {
		static void Main(string[] args) {
			Stream inputStream = Console.OpenStandardInput();
			using (FileStream fileStream = new FileStream(@"C:\user\body.dat", FileMode.Create)) {
				inputStream.CopyTo(fileStream);
			}
			EasyResponse();
		}
		static void EasyResponse() {

			Console.WriteLine("Expires: Thu, 04 Oct 2000 00:00:00 GMT");
			Console.WriteLine();

			Console.WriteLine("<!DOCTYPE html>");
			Console.WriteLine("<html lang="ja">");
			Console.WriteLine("<head>");
			Console.WriteLine("</head>");
			Console.WriteLine("<body>");
			Console.WriteLine("OK");
			Console.WriteLine("</body>");
			Console.WriteLine("</html>");

		}

	}
}

C# でビルドした exe が存在するディレクトリを AN HTTPD の一般パスに登録して、.exe を『一般パスでも実行する』ようにし、FORM の ACTION を exe ファイルにすれば c:\user\body.dat にアップロード情報が書き込まれます。




【PHPの最新記事】
posted by lightbox at 2014-09-05 02:13 | PHP | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり