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の最新記事】
- ロリポップのモジュール版 PHP でエラーを出力する方法
- PHP : unset によるオブジェクトのプロパティのと配列の要素の削除
- レンタルサーバで PHP のバージョンを 5.4 から 5.6 に変更する時の注意事項
- 【3大手法】 PHP で変数を埋め込んだ画面定義を外部ファイルにして、ループ内で展開する
- PHP で pathinfo と mime 情報やその他を合体した、get_finfo 関数を使って、opendir からファイル一覧を出力
- Windows で、MySQL を使っているので phpMyAdmin で参照しようとして、AN HTTPD だと setup が動かなかったので Apache を入れようとしたらいろいろルールがあっ..
- PHP で問い合わせ画面のページリンクを常に5つ作成しておいて、jQuery でいらないリンクを非表示にする
- PHP : HTMLのinput要素のname属性に二次元配列を指定して getElementsByName と jQueryのinput[name='value']:eq(n) でアクセステスト
- PHP の簡易ログとしては file_put_contents が使われますが、表現方法をいろいろテストして行くと、PHP のバージョンを 5.4.0 以上にして json_encode を使いたくな..
- さくらのサーバーで hash_hmac のアルゴリズムで使えるもの
- Pear を使用してダウンロード時のみ zip 圧縮してブラウザにデータを送る( プログレスバーはでません )
- Windows 環境で Pear のインストール
- PHP : php-5.3.1 の日付関数の注意点
- PHP : 暗号化と複合( libmcrypt )
- begin で始まるテキストで添付されたファイル(uuencode)を元に戻す方法


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




