トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

PHP/クライアント側のバイナリデータをPHPで取得する方法

Last-modified: 2007-10-22 (月) 01:10:36 (3621d)
Top / PHP / クライアント側のバイナリデータをPHPで取得する方法

PHP

ブラウザでファイルを参照し、PHPに渡す方法

ブラウザ側で次のように記入すると、バイナリデータをPHPプログラムに渡すことができます。

<html>
<body>
<form method="post" enctype="multipart/form-data" action="http://foo.jp/php/upload.php">
<input type="file" name="file0" value="">
<input type="submit" value="送信">
</form>
</body>
</html>

PHP側でバイナリデータを受け取る方法

PHP側で次のように記入すると、バイナリデータを受け取ることができます。

<?php
$directory = './log/';

// ダウンロード ファイル
$downloadFile = "";
if (strlen($_GET['get']) > 0) {
    $downloadFile = $directory . $_GET['get'];
} else if (strlen($_POST['get']) > 0) {
    $downloadFile = $directory . $_POST['get'];
}

if (strlen($downloadFile) > 0) {
    // ************************************************************************
    // ファイル ダウンロード
    // ************************************************************************
    if (file_exists($downloadFile)) {
        $response = readFile($downloadFile);
        header("Content-type: application/octet-stream");
        //バイナリファイル送信
        print($response);
        //ファイル削除
        unlink($downloadFile);
    } else {
        print("busy");
    }
} else {
    // ************************************************************************
    // ファイル アップロード
    // ************************************************************************
    $uploadFile = $directory . $_FILES['file0']['name'];
    if (move_uploaded_file($_FILES['file0']['tmp_name'], $uploadFile)) {
        //成功
        print "OK";
    } else {
        //失敗
        print "NG";
    }
}

function readFile($filename)
{
    $ret = "";

    //バイナリファイル読込
    if (!file_exists($filename))
    {
        $ret = ""; // "not found";
    } else {
        if (!($fp = fopen($filename, 'rb'))) exit;
        flock($fp, 2);
        $size = filesize($filename);
        $ret = fread($fp, $size);
        fclose($fp);
    }
    return $ret;
}
?>

PHP側に本当に渡っているか、確認するためのプログラム(report.php)

PHP側で受け取るためには、$_FILESにファイル参照用のデータが入っていることが重要です。

<?php
    echo "<pre>";
    echo "_GET\n";
    print_r($_GET);

    echo "---\n";
    echo "_POST\n";
    print_r($_POST);

    echo "---\n";
    echo "_FILES\n";
    print_r($_FILES);

    echo "---\n";
    echo "php_errormsg\n";
    echo $php_errormsg;

    echo "---\n";
    echo "apache_request_headers\n";
    print_r(apache_request_headers());

    echo "</pre>";
?>

apache_request_headers()について

クライアントからapacheにリクエストするヘッダ内容が見られて、便利です。次のようにすると、コロンで区切って表示できます。

<?php
$headers = apache_request_headers();
foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}
?>

出力例

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, application/vnd.ms-powerpoint, */*
Accept-Encoding: gzip, deflate
Accept-Language: ja
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 212
Content-Type: multipart/form-data; boundary=---------------------------7d728e38b137e
Host: papuu.jp
UA-CPU: x86
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; (R1 1.5); .NET CLR 1.1.4322; .NET CLR 2.0.50727)

リンク