3

PHP 5 では、Web フォーム経由で XML ファイルをアップロードし、SimpleXMLを使用して解析したいと考えています。

SimpleXML の例をいくつか試しましたが、CentOS 6 Linux サーバーで問題なく動作します。

ただし、アップロードされたファイルを PHP で処理した経験はまだありません。

を使用する必要が$_FILESあり、常に一時ファイルを使用する必要がありますか?それとも完全にメモリ内で実行できますか?

PHPクックブックから、この例をコピーしました:

<html>
<body>

<?php if ($_SERVER['REQUEST_METHOD'] == 'GET') { ?>

        <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME'] ?>"
        enctype="multipart/form-data">
        <input type="file" name="doc"/>
        <input type="submit" value="Send File"/>
        </form>

<?php } else {
                if (isset($_FILES['doc']) &&
                    ($_FILES['doc']['error'] == UPLOAD_ERR_OK)) {
                        $oldPath = $_FILES['doc']['tmp_name'];
                        $newPath = '/tmp/' . basename($_FILES['doc']['name']);

                        if (move_uploaded_file($oldPath, $newPath)) {
                                print "File moved from $oldPath to $newPath";
                        } else {
                                print "Couldn't move $oldPath to $newPath";
                        }
                } else {
                        print "No valid file uploaded.";
                }
        }
?>

</body>
</html>

それは正常に機能しprint_r、私が追加したステートメントに対して、次の出力が出力されます。

Array
(
    [document] => Array
        (
            [name] => my_file.xml
            [type] => text/xml
            [tmp_name] => /tmp/phpRD9cYI
            [error] => 0
            [size] => 1610252
        )

)

そして、私はファイルを見ることができ/tmp/my_file.xmlます。

私の質問は、一時ファイルの作成をスキップできるかどうかです。

私はそれらが好きではありません:

  1. それらは時々セキュリティの問題です
  2. それらはクリーンアップする必要があります(cronjobによって?)
  3. それらの名前が衝突する可能性があります (1 でない限り、おそらくめったに起こりません)

更新:また、わかりません。ファイルを読み取れないのはなぜ$oldPathですか? そこには見つからないので、に電話してからmove_uploaded_file()読む必要があり$newPathます...

4

1 に答える 1

9

ファイルを新しいフォルダーに保存/移動する必要はありません。

if (isset($_FILES['doc']) && ($_FILES['doc']['error'] == UPLOAD_ERR_OK)) {
    $xml = simplexml_load_file($_FILES['doc']['tmp_name']);                        
}

生成された一時ファイルは、PHP スクリプトが終了すると自動的に削除されます。お役に立てれば。

于 2015-01-08T09:32:39.417 に答える