0

ユーザーが複数の画像をアップロードできるフォームがあり、各画像の上限は 2MB です。フォームが送信されると、画像はサーバー (この場合は私のコンピューター) に保存されます。

問題 複数のファイルをアップロードする場合、アップロードされた最初の画像は常にサーバーへのアップロードに失敗しますが、他の画像 (例: 2 番目、3 番目など) はコンピュータに正常に保存できます.1つの画像、画像もアップロードに失敗します。

フォームから送信された最初の画像は常にアップロードに失敗すると結論付けましたが、画像ファイルの tmp_name を正常にエコーできるため、その理由がわかりません。

マイコード(抜粋):

  if(isset($_FILES['upload']['tmp_name']))
 {
$numfile=count($_FILES['upload']['tmp_name']);

    for($i=0;$i<$numfile;$i++)
    {
        if(!empty($_FILES['upload']['tmp_name'][$i]))
        {
            if(is_uploaded_file($_FILES['upload']['tmp_name'][$i]))
            {

                //Conditionals for uploaded file
                $foldername=$_SESSION['UserId'];
                $cat=$_POST['category'];
                $sub=$_POST['subcat'];
                $itemname=$_POST['itemname'];
                $allowed_filetypes=array('.jpg','.gif','.bmp','.png','.JPG');
                $max_filesize = 2097152; // Maximum filesize in BYTES (currently 2.0MB).
                $upload_path = 'C:\Users\Kence\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\'; // The place the files will be uploaded to.

                //Checks if Folder for User exists
                //If not, A folder for the user is created to store the user's images
                if(!is_dir($upload_path))
                {
                    $upload_path=mkdir($upload_path,0644,true);
                }

                $filename = $_FILES['upload']['name'][$i]; // Get the name of the file (including file extension).
                $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.

                // Check if the filetype is allowed, if not DIE and inform the user.
                if(in_array($ext,$allowed_filetypes))
                {
                    if(filesize($_FILES['upload']['tmp_name'][$i])<$max_filesize)
                    {
                        if(is_writable($upload_path))
                        {echo"$upload_path <br>";
                        print_r($_FILES);
                            if(!move_uploaded_file($_FILES['upload']['tmp_name'][$i],"$upload_path" . $filename))
                            {
                                $errormsg="Upload Failed.Error in moving file";
                            }
                        }
                        else
                        {
                        $errormsg="Image Upload Failed.";
                        }
                    }
                    else
                    {
                        $errormsg="Upload failed.ONly images below 2MB are allowed";
                    }
                }
                else
                {
                    $errormsg="Error. Only JPEG,PNG and BMP files are allowed";
                }

            }
            else
            {
                $errormsg="Error.File not uploaded";
            }
        }
    }

}
else
{
$errormsg="Upload failed";
}

エラー メッセージ エラー メッセージ が表示されます

Error.ファイルがアップロードされていません

フォームコード:

<body onload="getcategory()">
  <form action="<?PHP echo $_SERVER['PHP_SELF'] ?>" name="additem" enctype="multipart/form-data" method="POST">
<table>
<tr>
  <td>Select Category: </td><td>
    <select name="category" id="category" onchange="getsubcategory(this)">
      <option disabled="disabled" value="">Choose a category</option>
    </select>
  </td>
</tr>
<tr>
  <td>Select SubCategory</td>
  <td>
    <select id="subcat" name="subcat">
      <option value=""></option>
    </select>
  </td>
</tr>
<tr>
  <td>Item Name</td>
  <td><input type="text" name="itemname" size="30" maxlength="50" required="required"></td>
</tr>
<tr>
  <td>Item Price</td>
  <td><input type="number" name="itemprice" size="30" min="1" required="required"></td>
</tr>
<tr>
  <td>Item Info</td>
  <td><textarea name="iteminfo" col="40" rows="10" maxlength="300" required="required"></textarea>
</tr>

<tr>
  <td>Filename:</td>
  <td><input type="file" name="upload[]" /></td>
</tr>

<tr>
  <td>Filename:</td>
  <td><input type="file" name="upload[]" /></td>
</tr>

<tr>
  <td>Filename:</td>
  <td><input type="file" name="upload[]" /></td>
</tr>

<tr>
  <td>Filename:</td>
  <td><input type="file" name="upload[]" /></td>
</tr>

<tr>
  <td>Filename:</td>
  <td><input type="file" name="upload[]" /></td>
</tr>
<tr>
 <td colspan="2"><input type="SUBMIT" name="Button" value="Submit"></td>
</tr>
<tr>
  <td colspan="2"><?PHP if(isset($errormsg)){echo"$errormsg";}?></td>
</tr>       
<tr>
  <td colspan="3"><font color="#FF0000"></font></td>            
</tr> 

私はできますが、アップロードしようとしているすべての画像が正常に表示されますprint_r ($_FILES)tmp_name

編集 手順の実行/ 試行 tmp_name のアップロードのみが処理されるように、if(!empty) チェックを追加しました。したがって、空のアップロードは無視され、エラーが削除されます (Sven の親切な助けに感謝します)。

Error.File not uploaded

ただし、それでも、フォームに送信された最初の画像は保存されません(つまり、画像を 1 つだけアップロードした場合、エラーなしで失敗した場合、複数の画像をアップロードした場合、最初の画像のみが保存されません残りは正常に保存されますが、アップロードされます。)ただし、ページを更新すると(同じフォームを再送信すると)、最初の画像が保存されます。

ここでの問題は、ファイル パスが書き込み可能ではないため、最初の画像が保存されないことです。ただし、最初の画像のファイル パスが書き込み可能でない場合、なぜ後続の画像に有効なファイルがあるのか​​ ということです。パス、同じコードで実行されているときは? また、ページを更新すると (フォームを再送信すると)、魔法のように最初の画像が正常に保存されるのはなぜですか (これは、ファイル パスが書き込み可能になったことを意味します)。

私の print_r($_FILES); の結果

Array ( 
    [upload] => Array ( 
        [name] => Array ( 
            [0] => download (1).jpg 
            [1] => download.jpg 
            [2] => 
            [3] => 
            [4] => 
        ) 
        [type] => Array ( 
            [0] => image/jpeg 
            [1] => image/jpeg 
            [2] => 
            [3] => 
            [4] => 
        ) 
        [tmp_name] => Array ( 
            [0] => C:\Users\Kence\Desktop\UniServer\tmp\php474.tmp 
            [1] => C:\Users\Kence\Desktop\UniServer\tmp\php475.tmp 
            [2] => 
            [3] => 
            [4] => 
        ) 
        [error] => Array ( 
            [0] => 0 
            [1] => 0 
            [2] => 4 
            [3] => 4 
            [4] => 4 
        ) 
        [size] => Array ( 
            [0] => 6229 
            [1] => 6984 
            [2] => 0 
            [3] => 0 
            [4] => 0 
        ) 
    ) 
)

誰かがどこで何を間違っているか指摘できますか? 私は過去3時間試してきましたが、何が間違っているのかまだわかりません。

編集:解決済み

私の間違いを理解しました。

もともと書いた

if(!is_dir($upload_path))
{
    $upload_path=mkdir($upload_path,0644,true);
}

そして私はそれをに変更しました

if(!is_dir($upload_path))
{
    mkdir($upload_path,0644,true);
}

私が得ていたエラーを解決しました。私の側の本当にばかげた間違い

4

3 に答える 3

1

ダンプを見て、コードと比較してください。

フィールド 3、4、5 など、ファイルがアップロードされていない場合でも、コードはすべてのアップロード フィールドにアクセスします。したがって、コードはこれらすべてのファイルを反復処理しrealpath()、空の文字列を使用します。

これにより、「Error.File not upload」というエラー メッセージが表示されます。ファイル番号 3、4、および 5 はアップロードされておらず、空のままになっているため、これは正しいです。

あなたのコードはこれに対処する必要があります。

realpath()セキュリティ機能として、を使用しないでくださいis_uploaded_file()。PHP には、アップロード中に作成されたファイル名のリストがあり、それらのファイルのみをアップロード スクリプトで処理できるようにする必要があります。攻撃者が PHP をだまして "tmp_name" を操作させたとしても、他のファイルには触れたくありません。

于 2013-07-28T13:15:44.197 に答える
0

私の間違いを理解しました。

もともと書いた

if(!is_dir($upload_path))
{
    $upload_path=mkdir($upload_path,0644,true);
}

そして私はそれをに変更しました

if(!is_dir($upload_path))
{
    mkdir($upload_path,0644,true);
}

私が得ていたエラーを解決しました。私の側の本当にばかげた間違い。

于 2013-07-28T15:46:52.393 に答える
0

ここでの「アップロード」$_FILES['upload']は、フォーム内のファイル フィールドの名前を指します。
アップロードという名前のファイル フィールドからのファイルがアップロードされた場合にのみ、チェックしてい

ます。フォームの最初のアップロード フィールドに別の名前を付けたのでしょうか。

于 2013-07-28T11:00:41.663 に答える