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)を元に戻す方法