4

フォームから送信された 3 つのファイルを取得してサーバーに保存する、複数の画像のアップロードを構築しようとしています。

私は次のものを持っていますが、「無効なファイル」を受け取っても、どこが間違っているのか分かりますか?

for($i = 0; $i < 3; $i++) {
 $aFile = $_FILES['file'][$i];




    $allowedExts = array("jpg", "jpeg", "gif", "png");
    $extension = end(explode(".", $aFile["file"]["name"]));
    if ((($aFile["file"]["type"] == "image/gif")
    || ($aFile["file"]["type"] == "image/jpeg")
    || ($aFile["file"]["type"] == "image/png")
    || ($aFile["file"]["type"] == "image/pjpeg"))
    && ($aFile["file"]["size"] < 20000)
    && in_array($extension, $allowedExts))
      {
      if ($aFile["file"]["error"] > 0)
        {
        echo "Return Code: " .$aFile["file"]["error"] . "<br>";
        }
      else
        {


        if (file_exists("upload/" . $aFile["file"]["name"]))
          {
          echo $aFile["file"]["name"] . " already exists. ";
          }
        else
          {
          move_uploaded_file($aFile['tmp_name'],
          "upload/" . date('U')."-".$aFile["file"]["name"]);  // add a unique string to the uploaded filename so that it is unique.
          echo "Image Uploaded Successfully";
          }
        }
      }
    else
      {
      echo "Invalid file";

    }

}

** HTML **

<li>
    <label for="picture_1">picture 1 : </label>
    <input type="file" name="file">
</li>
<li>
    <label for="picture_2">picture 2 : </label>
    <input type="file" name="picture_2">
</li>
<li>
    <label for="picture_3">picture 3 : </label>
    <input type="file" name="picture_3">
</li>
4

2 に答える 2

1

私が推測するように、主な問題は HTML 要素名と で使用されている名前$_FILESが一致しないことです。つまり、最初のファイル入力名「file」を使用しました。「picture_1」である必要があります。そして、ファイル処理部分でインデックス 0 から 2 を使用しました。「picture_1」、「picture_2」、および「picture_3」に一致するように、1 ~ 3 にする必要があります。

フォームに が含まれている必要があることに注意してくださいenctype="multipart/form-data"。そうでない場合、ファイルはアップロードされません。これが正しいものです:

これを実装するには、次の 2 つの方法が あり
ます。
file[]

アプローチ 1: ファイル入力に個別に名前を付ける

HTML

<form method="post" enctype="multipart/form-data">
    <li>
        <label for="picture_1">picture 1 : </label>
        <input type="file" name="picture_1" id="picture_1" />
    </li>
    <li>
        <label for="picture_2">picture 2 : </label>
        <input type="file" name="picture_2" id="picture_2" />
    </li>
    <li>
        <label for="picture_3">picture 3 : </label>
        <input type="file" name="picture_3" id="picture_3" />
    </li>
    <input type="submit" name="submit" value="Upload" />
</form>

PHP

if(sizeof($_FILES)){ 
    for($i = 1; $i <= 3; $i++) {
     $aFile = $_FILES['picture_'.$i];
     if(empty($aFile['tmp_name'])) continue; # skip for empty elements

        $allowedExts = array("jpg", "jpeg", "gif", "png");
        $extension = end(explode(".", $aFile["name"]));
        if ((($aFile["type"] == "image/gif")
        || ($aFile["type"] == "image/jpeg")
        || ($aFile["type"] == "image/png")
        || ($aFile["type"] == "image/pjpeg"))
        && ($aFile["size"] < 20000)
        && in_array(strtolower($extension), $allowedExts))
          {
          if ($aFile["error"] > 0)
            {
            echo "Return Code: " .$aFile["error"] . "<br>";
            }
          else
            {       
            if (file_exists("upload/" . $aFile["name"]))
              {
              echo $aFile["name"] . " already exists. ";
              }
            else
              {
              move_uploaded_file($aFile['tmp_name'], 
                "upload/" . date('U')."-".$aFile["name"]); 
              echo "Image Uploaded Successfully";
              }
            }
          }
        else
        {
          echo "Invalid file";  
        }
    }
}

アプローチ 2: ファイル入力をグループとして命名する

HTML

<form method="post" enctype="multipart/form-data">
    <li>
        <label for="picture_1">picture 1 : </label>
        <input type="file" name="file[]" id="picture_1" />
    </li>
    <li>
        <label for="picture_2">picture 2 : </label>
        <input type="file" name="file[]" id="picture_2" />
    </li>
    <li>
        <label for="picture_3">picture 3 : </label>
        <input type="file" name="file[]" id="picture_3" />
    </li>
    <input type="submit" name="submit" value="Upload" />
</form>

PHP

if(sizeof($_FILES)){        
    for($i = 0; $i < 3; $i++) {
        $name       = $_FILES['file']['name'][$i];
        $type       = $_FILES['file']['type'][$i];
        $tmp_name   = $_FILES['file']['tmp_name'][$i];
        $error     = $_FILES['file']['error'][$i];
        $size       = $_FILES['file']['size'][$i];

        if(empty($name)) continue; # skip for empty element

        $allowedExts = array("jpg", "jpeg", "gif", "png");
        $extension = end(explode(".", $name));
        if ((  ($type == "image/gif")
            || ($type == "image/jpeg")
            || ($type == "image/png")
            || ($type == "image/pjpeg"))
            && $size < 20000
            && in_array(strtolower($extension), $allowedExts) )
          {
          if ($error > 0)
            {
            echo "Return Code: " .$error . "<br>";
            }
          else
            {               
            if (file_exists("upload/" . $name))
              {
              echo $aFile["file"]["name"] . " already exists. ";
              }
            else
              {
              move_uploaded_file($tmp_name,
              "upload/" . date('U')."-".$name); 
              echo "Image Uploaded Successfully";
              }
            }
          }
        else
          {
          echo "Invalid file";      
        }       
    }
}

クレジット:

  • ファイル拡張子は、 strtolower()を使用して小文字でチェックする必要があります。
  • を使用する場合<label for="some_id">、それぞれの HTML 要素に同じ ID 属性を含めることができます (例: <input type="file" name="..." id="some_id" />. ラベルをクリックすると、要素のonclickイベントがトリガーされます。
于 2012-12-19T03:05:47.410 に答える
0

ファイルサイズはバイト単位で表されます。

条件の 1 つは、ファイルサイズ制限のチェックです。($aFile["file"]["size"] < 20000)

これにより、ファイルサイズの制限が 20 KB に引き下げられます。

たまたまその制限を超えた可能性があります。

アップロードするファイルのサイズを確認してください。

アップデート

3 つのアップロード フィールドを送信すると、ファイル構造は次のようになります。

array (size=1)
  'file' => 
    array (size=5)
     'name' => 
        array (size=3)
          1 => string 'all_products (6).csv' (length=20)
          2 => string 'pricero (3).csv' (length=15)
          3 => string 'pricero.csv' (length=11)
      'type' => 
        array (size=3)
          1 => string 'application/octet-stream' (length=24)
          2 => string 'application/octet-stream' (length=24)
          3 => string 'application/octet-stream' (length=24)
      'tmp_name' => 
        array (size=3)
          1 => string 'E:\server\wamp\tmp\phpEF79.tmp' (length=30)
          2 => string 'E:\server\wamp\tmp\phpEF7A.tmp' (length=30)
          3 => string 'E:\server\wamp\tmp\phpEF7B.tmp' (length=30)
      'error' => 
        array (size=3)
          1 => int 0
          2 => int 0
          3 => int 0
      'size' => 
        array (size=3)
          1 => int 29702
          2 => int 23095
          3 => int 23095

変数に問題があり$aFileます。スクリプトを実行しようとしましたが、エラーが発生しました (未定義のインデックスなど)。

于 2012-12-18T17:07:06.600 に答える