2

私はファイルをアップロードしようとしているので、ここに私のhtmlがあります:

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    Select a file: <input type="file" name="upload">
    <input type="submit">
</form>

これが私のphpです:

    <?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL | E_STRICT);
    session_start();
    $allowedExts = array("doc", "docx");
    $extension = pathinfo( $_FILES["upload"]["name"],PATHINFO_EXTENSION);

    if (($_FILES["upload"]["size"] < 200000)
    && in_array($extension, $allowedExts)) {
        if ($_FILES["upload"]["error"] > 0)
        {
            echo "Return Code: " . $_FILES["upload"]["error"] . "<br />";
        }
        else
        {
            echo "Upload: " . $_FILES["upload"]["name"] . "<br />";
            echo "Type: " . $_FILES["upload"]["type"] . "<br />";
            echo "Size: " . ($_FILES["upload"]["size"] / 1024) . " Kb<br />";
            echo "Temp file: " . $_FILES["upload"]["tmp_name"] . "<br />";

            $dir_exists = is_dir("Proposals/". $_SESSION["FirstName"] ."/");
            $file_exists = file_exists("Proposals/".$_SESSION["FirstName"] ."/" . $_FILES["upload"]["name"]);
            $folderName=$_SESSION["FirstName"];
            $baseDir = "Proposals" ;
            //var_dump($_FILES);
            //die();
            // Create directory if it does not exist
            if (! $dir_exists) {
                if(!is_dir($baseDir))
                    mkdir($baseDir);
                mkdir($baseDir . DIRECTORY_SEPARATOR . $_SESSION["FirstName"]);
            } 

            if ($file_exists) {
                echo $_FILES["upload"]["name"] . " already exists. ";
            } else {
                move_uploaded_file($_FILES["upload"]["tmp_name"],
                "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]);
                echo "Stored in: " . "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"];
            }
        }
    } else {
        echo "Invalid file";
    }

?>

出力されたファイル:

Type: application/msword
Size: 124.9296875 Kb
Temp file: /tmp/phpUWDc3s

var_dumpは、これをテストファイルに出力しました。

array(1) { ["upload"]=> array(5) { 
["name"]=> string(18) "Test.doc" 
["type"]=> string(18) "application/msword" 
["tmp_name"]=> string(14) "/tmp/phpUWDc3s" 
["error"]=> int(0) 
["size"]=> int(127928) } }

そしてそれが私に与える警告/エラーは次のとおりです:

Strict Standards: Only variables should be passed by reference in /disks/vhosts/***/***/upload_file.php on line 6 Upload: Test.doc

mkdirコードがないと、次のようになります。

Warning: move_uploaded_file(Proposals/Test.doc): failed to open stream: Permission denied in /disks/vhosts/***/***/upload_file.php on line 40 Warning: move_uploaded_file(): Unable to move '/tmp/phpQmgxdO' to 'Proposals/Test.doc' in /disks/vhosts/***/***/upload_file.php on line 40 Stored in: Proposals/Test.doc

mkdirの有無にかかわらず、何らかの理由で、正しいファイルタイプであっても、提案用紙にファイルが配置されません。これはサーバーの権限の問題ですか、それともこれをすべて機能させるために追加/変更する必要があるものがありますか?

4

2 に答える 2

1

A. 最初のエラー

厳格な基準: 6 行目の /disks/vhosts/ / /upload_file.php では、参照によって変数のみを渡す必要があります アップロード: Test.doc

変化する

  $extension = end(explode(".", $_FILES["upload"]["name"]));

  $extension = path_info( $_FILES["upload"]["name"],PATHINFO_EXTENSION);

B. 2 番目のエラー

警告: move_uploaded_file(Proposals/Test.doc): ストリームを開くことができませんでした: /disks/vhosts/ / /upload_file.php 行 40 で許可が拒否されました警告: move_uploaded_file(): '/tmp/phpQmgxdO' を 'Proposals に移動できません/disks/vhosts/ 内の /Test.doc' / /upload_file.php 40 行目 保存場所: Proposals/Test.doc

このようなものをフルパスで使用します/disks/vhosts/***/***/

$baseDir = __DIR__ ; // or /disks/vhosts/***/***/ has applicable 
if (! $dir_exists) {
    if (is_writable("$baseDir/Proposals/")) {
        mkdir("$baseDir/Proposals/" . $_SESSION["FirstName"]);
    } else {
        trigger_error("Proposals/ is not writeable");
    }
}
于 2012-10-03T17:08:24.473 に答える
1

あなたは現在このコードを持っています...

if(!$dir_exists) {
    mkdir("Proposals/". $_SESSION["FirstName"]);
} elseif ($file_exists) {
    echo $_FILES["upload"]["name"] . " already exists. ";
} else {
    move_uploaded_file($_FILES["upload"]["tmp_name"],
    "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]);
    echo "Stored in: " . "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"];
}

move_uploaded_file探しているディレクトリが存在する場合にのみ表示されます。その行をifステートメントの下に移動すると、必要に応じてディレクトリが作成され、ファイルがアップロードされます。

于 2012-10-03T17:16:57.120 に答える