2015-11-02 51 views
-2
form action="upload" enctype="multipart/form-data" method="post"> 
<input id="file" name="file" type="file" /> 
<input id="Submit" name="submit" type="submit" value="Submit" /> 
</form> 

在服務器側獲取錯誤而上傳()

include 'reqFunctions.php'; 
$uploaddir = '/path/'; 
$idx = "file"; 
$res = array("success" => true, "status" =>array()); 
if (isset($_FILES[$idx]) && is_array($_FILES[$idx])) { 
    foreach ($_FILES[$idx]["error"] as $key => $error) { 
      $status = array("success" => true); 
     if ($error == UPLOAD_ERR_OK) { 
      $tmp_name = $_FILES[$idx]["tmp_name"][$key]; 
      $name = $_FILES[$idx]["name"][$key]; 
      $name = $_FILES[$idx]["name"][$key]; 
      $extension=end(explode(".", $name)); 
      $newfilename=generateRandomString(10)."_".$timestamp1."_".generateRandomString(10).$extension; 
      if (move_uploaded_file($tmp_name, $uploaddir.$newfilename)) { 
       $status["message"] = "ok"; 
       $status["path"]="images.smsiland.com/post/large/".$newfilename; 
      } else { 
       $res["success"] = false; 
       $status["success"] = false; 
       $status["error"] = error_get_last(); 
       $status["message"] = "internal server error"; 
      } 
     } else { 
      $res["success"] = false; 
      $status["success"] = false; 
      $status["error"] = $error; 
      $status["message"] = "upload error"; 
     } 
     $res["status"][] = $status; 
    } 
} 

echo(json_encode($res)); 


警告提供的foreach文件無效的參數:對的foreach()無效的論點提供在/upload.php上線
{「success」:true,「status」:[]}

+3

是'$ _FILES [$ IDX] [ 「錯誤」]'數組?我不這麼認爲。 – Daan

+0

請SSEE全碼http://pastebin.com/zKjgZbP8 – xrcwrn

+1

'$ _FILES [$ IDX] [ 「錯誤」]'是一個數字,而不是陣列。閱讀[文檔](http://php.net/manual/en/features.file-upload.errors.php)。 – axiac

回答

1

before before ACH線路碼 因爲沒有陣列中$ _FILES存在[$ IDX];它返回0

<?php 
$uploaddir = '/upload/'; 
    $idx = "file"; 
    //echo "<pre>";print_r($_FILES);exit; 
    $res = array("success" => true, "status" =>array()); 
    if (isset($_FILES[$idx]['name']) && is_array($_FILES[$idx])) { 
     if(is_array($_FILES[$idx]["error"])){ 
      foreach ($_FILES[$idx]["error"] as $key => $error) { 
       $status = array("success" => true); 
      if ($error == UPLOAD_ERR_OK) { 
       //move upload codde goes here 
       } 
      } 
     }else{ 
      //echo "your code "; 
     } 

      } 

      ?> 
1

一個foreach聲明僅適用於數組,你的代碼並沒有引起$FILES數組包含數組,因爲你還沒有告訴你希望它是一個數組的HTML。

瀏覽器正在返回$FILES陣列像這樣:

Array 
(
    [file] => Array 
     (
      [name] => xxx.bmp 
      [type] => image/bmp 
      [tmp_name] => \tmp\php73AB.tmp 
      [error] => 0 
      [size] => 78918 
     ) 

) 

因爲你有文件陣列中使用這個HTML語句

<input id="file" name="file" type="file" /> 

注意所有的字段是標量場,這是造成在foreach ($_FILES[$idx]["error"] as $key => $error) {生成一個警告,然後不能執行foreach語句裏面什麼。

foreach ($_FILES[$idx]["error"] as $key => $error) { 
    $status = array("success" => true); 
    if ($error == UPLOAD_ERR_OK) { 
      . . 
    } 
} 

我asssuming這個代碼只是第1步,最終要允許腳本上傳多個文件。如果是這樣,那麼簡單的解決辦法是改變HTML的<input type="file"...標籤這樣

<input id="file" name="file[]" type="file" /> 

那麼瀏覽器就會產生$_FILES陣列這樣

Array 
(
    [file] => Array 
     (
      [name] => Array 
       (
        [0] => xxx.bmp 
       ) 
      [type] => Array 
       (
        [0] => image/bmp 
       ) 
      [tmp_name] => Array 
       (
        [0] => \tmp\phpCABF.tmp 
       ) 
      [error] => Array 
       (
        [0] => 0 
       ) 
      [size] => Array 
       (
        [0] => 78918 
       ) 
     ) 
) 

您的代碼可以編譯爲$FILES數組中的每個字段本身也不是數組。

另外,您可以添加另一

<input id="file1" name="file[]" type="file" /> 
<input id="file2" name="file[]" type="file" /> 

這將有同樣的效果。

+0

但爲什麼它正如我在回答的開頭說的是給錯誤 – xrcwrn

+0

。因爲使用了'<輸入的ID =「文件」名稱=「文件」類型=「文件」 />'當瀏覽器建立將填充'$ _FILES'數組中的數據數組內的數據被創建爲標量變量而不是一組子陣列。因此'foreach($ _FILES [$ idx] [「error」] ....'不是數組,因此PHP錯誤是因爲'foreach'只能用在數組上 – RiggsFolly

+0

php代碼沒有任何問題只需更新輸入 – xrcwrn