2012-04-16 95 views
0

我喜欢用数组的帮助上传一些图像到目录。因此,我有这样的代码:多图像上传文件上传错误数量

$allowedExtensions = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif'); 
      $maxSize = 2097152; 
      $Dir = "a/b/c/d"; 
      $storageDir = "a/b/c/d/tmp_images"; 

      //Arrays 
      $errors2 = $output = array(); 


      if(!empty($_FILES['image'])){ 

      // Validation loop (I prefer for loops for this specific task) 
      for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) { 

       $fileName = $_FILES['image']['name'][$i]; 
       $fileSize = $_FILES['image']['size'][$i]; 
       /*$fileErr = $_FILES['image']['error'][$i];*/ 
       $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); 

       // Dateiendung überprüfen 
       if (!in_array($fileExt, $allowedExtensions)) { 
        $errors2[$fileName][] = "format $fileExt in $fileName is not accepted"; 
       } 

       // check filesize 
       if ($fileSize > $maxSize) { 
        $errors2[$fileName][] = "maxsize of 2MB exceeded"; 
       } 


      } 

      /*// Handle validation errors here 
      if (count($errors) > 0) { 
       echo "Fehler beim Upload des Bildmaterials:"; 
       echo ($errors); ->gibt "Array" aus 
      }*/ 


      if (is_dir($Dir)){ 
       mkdir($storageDir, 0755); 
      }else{ 
       mkdir($Dir, 0755); 
       mkdir($storageDir, 0755); 
      } 


      // Fileupload 
      for ($i = 0; isset($_FILES['image']['name'][$i]); $i++) { 

      // Get base info 
      $fileBase = basename($_FILES['image']['name'][$i]); 
      $fileName = pathinfo($fileBase, PATHINFO_FILENAME); 
      $fileExt = pathinfo($fileBase, PATHINFO_EXTENSION); 
      $fileTmp = $_FILES['image']['tmp_name'][$i]; 

      // Construct destination path 
      $fileDst = $storageDir.'/'.basename($_FILES['image']['name'][$i]); 
      for ($j = 0; file_exists($fileDst); $j++) { 
       $fileDst = "$storageDir/$fileName-$j.$fileExt"; 
      } 

      // Move the file 

      if (count($errors2) == 0) { 
       if (move_uploaded_file($fileTmp, $fileDst)) { 
            ... 
           } 
         } 

与代码的问题是以下内容:在上载与所接受结束它将回声出两个或多个文件的情况下:

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access abc2.png in /a/b/xxx.php on line xxx 

这指的是线:

if (move_uploaded_file($fileTmp, $fileDst)) { 

此消息将显示除第一个以外的每张图片。所以我不知道我做错了什么。如果有人能够帮助我,我会非常感激。我真的很感激。非常感谢。

回答

1

你的代码是非常similar我的答案在limiting the checking condition while uploading swf files

这是你应该如何实现这样的..

完整剧本

<?php 
error_reporting (E_ALL); 
$allowedExtensions = array (
     'jpg', 
     'jpeg', 
     'png', 
     'bmp', 
     'tiff', 
     'gif' 
); 
$maxSize = 2097152; 
$dirImage = "photos/tmp_images"; 
$errors = $output = array(); 
if (isset ($_FILES ['image'])) { 
    foreach ($_FILES ['image'] ['tmp_name'] as $key => $val) { 

     $fileName = $_FILES ['image'] ['name'] [$key]; 
     $fileSize = $_FILES ['image'] ['size'] [$key]; 
     $fileTemp = $_FILES ['image'] ['tmp_name'] [$key]; 

     $fileExt = pathinfo ($fileName, PATHINFO_EXTENSION); 
     $fileExt = strtolower ($fileExt); 

     if (empty ($fileName)) 
      continue; 

      // Dateiendung überprüfen 
     if (! in_array ($fileExt, $allowedExtensions)) { 
      $errors [$fileName] [] = "format $fileExt in $fileName is not accepted"; 
     } 

     if ($fileSize > $maxSize) { 
      $errors [$fileName] [] = "maxsize of 2MB exceeded"; 
     } 

     if (! mkdir_recursive ($dirImage, 0777)) { 
      $errors [$fileName] [] = "Error Creating /Writing Directory $dirImage "; 
     } 

     // Construct destination path 
     $fileDst = $dirImage . DIRECTORY_SEPARATOR . $fileName; 
     $filePrifix = basename ($fileName, "." . $fileExt); 
     $i = 0; 
     while (file_exists ($fileDst)) { 
      $i ++; 
      $fileDst = $dirImage . DIRECTORY_SEPARATOR . $filePrifix . "_" . $i . "." . $fileExt; 

     } 
     // Move the file 

     if (count ($errors) == 0) { 
      if (move_uploaded_file ($fileTemp, $fileDst)) { 
       // ... 

       $output [$fileName] = "OK"; 
      } 
     } 

    } 
} 

function mkdir_recursive($pathname, $mode) { 
    is_dir (dirname ($pathname)) || mkdir_recursive (dirname ($pathname), $mode); 
    return is_dir ($pathname) || mkdir ($pathname, $mode); 
} 
if (! empty ($errors)) { 
    echo "<pre>"; 
    foreach ($errors as $file => $error) { 
     echo $file, PHP_EOL; 
     echo "==============", PHP_EOL; 
     foreach ($error as $line) { 
      echo $line, PHP_EOL; 
     } 
     echo PHP_EOL; 
    } 
    echo "</pre>"; 
} 

if (! empty ($output)) { 
    echo "<pre>"; 
    echo "Uploaded Files", PHP_EOL; 
    foreach ($output as $file => $status) { 
     echo $file, "=", $status, PHP_EOL; 
    } 

    echo "</pre>"; 
} 
?> 


<form method="post" enctype="multipart/form-data"> 
    <label for="file">Filename 1:</label> <input type="file" name="image[]" 
     id="file" /> <br /> <label for="file">Filename 2:</label> <input 
     type="file" name="image[]" id="file" /> <br /> <label for="file">Filename 
     3:</label> <input type="file" name="image[]" id="file" /> <br /> <input 
     type="submit" name="submit" value="Submit" /> 
</form> 
+0

所有你需要做的是更新问题,而不是创建另一个... @bonny – Baba 2012-04-17 09:17:52

+0

它没有增长,因为你接受了一个答案,但没有表明你仍然有问题...当你编辑和添加新的信息时,每个人都会意识到并看到他们可以做些什么,直到问题得到解决...... – Baba 2012-04-17 09:26:29

+0

该功能假设是在同一页.......我会编辑它所以你可以理解如何使用它... – Baba 2012-04-17 09:39:51

2

首先,我将命名上传的字段分隔。例如。命名第一个字段<input name="image_1" type="file" />和第二个<input name="image_2" type="file" />。然后你可以遍历数组$_FILES改为:

foreach($_FILES as $fileId => $file){ 
    //make sure it's a file you want (optional) 
    if(!preg_match("/^image\_\d+$/",$fileId){ 
     continue; 
    } 

    //the rest of your code from the for loop 
} 

其次,你需要确保你的表单的加密类型是multipart/form-data

这有帮助吗?

+0

他用HTML5' ',所以他以这种形式得到它们在。 – 2012-04-16 08:08:09

+0

你好,谢谢或回答。问题是我不能轻易地命名每个字段,因为这个输入字段是由一个函数创建的。 – bonny 2012-04-16 09:22:01

1

你为什么要访问$_FILES超全局数组作为三维数组?

如果您想从<input type="file" name="image"/>上传文件的文件名,您所要做的只是$name = $_FILES[ 'image' ][ 'name' ]最后不需要[ $i ]

您需要循环像这样在$ _FILES中的条目:

foreach ($_FILES as $inputName => $fileData) 
{ 
    // $inputName is be 'image` for the first input and so on, 
    // $fileData will be an array of the attributes [ 'name', 'tmp_name', ... ] 
} 
+1

他使用HTML5'',所以他以这种格式获取它们。 – 2012-04-16 08:08:28

+0

我使用它,因为我想显示每个文件的显式错误消息。 – bonny 2012-04-16 09:23:37

1

我不知道这是否可以为您解决,但你可以尝试将这些转换为“正常” $_FILES值。

$arr_files = @$_FILES['image']; 

$_FILES  = array(); 
foreach(array_keys($arr_files['name']) as $h) 
$_FILES["image_{$h}"] = array( 'name'  => $arr_files['name'][$h], 
            'type'  => $arr_files['type'][$h], 
            'tmp_name' => $arr_files['tmp_name'][$h], 
            'error'  => $arr_files['error'][$h], 
            'size'  => $arr_files['size'][$h]); 

然后像正常一样运行循环。

See previous related answer