HTTP_Upload

HTML フォーム経由で送信されたファイルを お手軽かつ安全に管理します。

概要

この関数は、HTML <input type="file" /> フィールド経由でのファイルのアップロードを管理する高度なシステムを 提供します。以下のような機能があります。

以下の例では、ファイルをアップロードするために HTML フォームフィールド <input type="file" name="f" /> を用いることを想定しています。たとえばこのようなフォームです。

例 48-30単純なファイルアップロード用の HTML フォーム

単一ファイルのアップロードのサンプルを試してみるには、このようなフォームを使用します。

<?php
// 以下のサンプルコードを、ここに書きます
?>
<html>
 <head>
 </head>
 <body>
  <form name="fileuploadexample" method="POST" enctype="multipart/form-data"
   action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">
   <input type="file" name="f" />
   <input type="submit" name="submit" value="Submit" />
  </form>
 </body>
</html>

例 48-31単純なファイルのアップロード

以下のコードは、リクエストを監視し、ファイルがフォームから正常に アップロードされたかどうかを調べます。この例の場合、ファイルは サブディレクトリ uploads に移動されます。


<?php
require_once "HTTP/Upload.php";

$upload = new HTTP_Upload("en");
$file $upload->getFiles("f");

if ($file->isValid()) {
    $moved $file->moveTo("uploads/");
    if (!PEAR::isError($moved)) {
        echo "ファイルが uploads/ に移動されました。";
    } else {
        echo $moved->getMessage();
    }
} elseif ($file->isMissing()) {
    echo "ファイルがありません。";
} elseif ($file->isError()) {
    echo $file->errorMsg();
}
?>

例 48-32複数のファイルをアップロードするための HTML フォーム

複数ファイルのアップロードのサンプルを試してみるには、このようなフォームを使用します。

<?php
// 以下のサンプルコードを、ここに書きます
?>
<html>
 <head>
 </head>
 <body>
  <form name="fileuploadexample2" method="POST" enctype="multipart/form-data"
   action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">
   <input type="file" name="f1" />
   <input type="file" name="f2" />
   <input type="submit" name="submit" value="Submit" />
  </form>
 </body>
</html>

例 48-33複数のファイル、より進んだチェック

複数のファイルをアップロードするには、フォームフィールドの名前 (f) を f[] に変更し、 この名前で複数の <input /> フィールドを 作成します。


<?php
$upload = new HTTP_Upload("en");
$files $upload->getFiles();

foreach($files as $file){
    if (PEAR::isError($file)) {
        echo $file->getMessage();
    }

    if ($file->isValid()) {
        $file->setName("uniq");
        $dest_name $file->moveTo("uploads/");

        if (PEAR::isError($dest_name)) {
            echo $dest_name->getMessage();
        }

        $real $file->getProp("real");

    } elseif ($file->isMissing()) {
        echo "ファイルがありません。";
    } elseif ($file->isError()) {
        echo $file->errorMsg();
    }

    print_r($file->getProp());
}
?>

アップロードされたファイルの拡張情報

HTTP_Upload では、アップロードされたファイルの 拡張情報を getProp() メソッドで取得可能です。

mixed HTTP_Upload_File::getProp ([name])

name に何も指定しなかった場合は、このメソッドは アップロードされたファイルに関するすべての情報を含む配列を返します。 それ以外の場合は、指定したパラメータの値を文字列で返します。

とりうる値の内容は $_FILES 配列によって決まりますが、HTTP_Upload 用にカスタマイズされています。 以下に、プロパティをまとめます。

例 48-34getProp() 経由での拡張情報


<?php
require_once "HTTP/Upload.php";

$upload = new HTTP_Upload("en");
$file $upload->getFiles("f");

if ($file->isValid()) {
    echo "<pre>";
    print_r($file->getProp());
    echo "</pre>";

    printf("アップロードされたファイルの拡張子は %s です。"$file->getProp("ext"));
}
?>

国際化されたエラーメッセージ

HTTP_Upload の便利な機能のひとつに 国際化されたエラーメッセージのサポートがあります。これは、 エラー (不正なファイルがアップロードされたなど) が検出された場合に HTTP_Upload が何語でエラーメッセージを 返すのかをプログラマが指定できるということことを意味します。

HTTP_Upload のコンストラクタの最初の パラメータで、使用する言語を指定します。詳細は以下の例で 説明します。

例 48-35例


<?php
// ドイツ語のエラーメッセージ
$language "de";

require_once "HTTP/Upload.php";

$upload = new HTTP_Upload($language);
$file $upload->getFiles("f");

if ($file->isValid()) {
    $moved $file->moveTo("uploads/");
    if (!PEAR::isError($moved)) {
        echo "ファイルは uploads/ に移動されました。";
    } else {
        // ドイツ語のエラーメッセージを表示します
        echo "エラーが検出されました: " $moved->getMessage() . "<br />";
    }
}
?>