2013-07-24 22 views
0

上传多个文件时出现问题。我有一个类别下拉菜单和一个评论框,我需要将其与文件详细信息一起插入到数据库中。我有五个上传框显示在屏幕上。包括多个文件上传的注释

如果我上传一个文件,评论是空白的(即使它不应该是),并且该类别始终设置为第一个值。在进行一些测试后,看起来好像最终的上传评论和类别框正在覆盖所有的附件。通过上传五个具有不同类别和评论的文件进行测试,所有文件都显示最后的评论和类别。

我可以在脚本中看到问题,但我无法弄清楚如何为每个特定的上传实例指定一个类别或注释。

任何帮助表示赞赏。

 <?php 



    $upload_dir = "training/trainingDocuments/"; 
    $maxUploads = 5; 

    $msg = "Please select file(s) for uploading"; 
    $errors = array(); 

    if ($files = convert_files($_FILES["myTrainingFile"])) { 
     foreach($files as $i => $file) { 
      $fileName = $file["name"]; 
      $tempName = $file["tmp_name"]; 
      $fileSize = $file["size"]; 
      $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); 
      $blacklist = array('exe','php','jsp','js','bat','asp','aspx','com','dmg'); 

//    $newPath = $upload_dir .$fileName; 
      $dateUploaded = time() . microtime(); 

      if (in_array($fileExt, $blacklist)) { 
       $errors[$i] = "File type not allowed"; 
      } 

      if (!is_uploaded_file($tempName)) { 
       //$errors[$i] = "Uploading ".$fileName." failed."; 
      }else{ 
       echo '<h4>Uploading of :'.$fileName.' was a success.</h4>'; 
      } 

      //if(file_exists($newPath)){ 

       $name = pathinfo($fileName, PATHINFO_FILENAME); 
       $fileName = $name . '__' .uniqid(). '.' .$fileExt; 
       $newPath = $upload_dir .$fileName; 
//    }else{ 
// 
//    } 

      if (isset($errors[$i])) { 
       continue; 
      } 


      if (!move_uploaded_file($tempName, $newPath)) { 
       //$errors[$i] = "Uploading ".$fileName." failed."; 
      }else{ 
       //echo 'File moved'; 
      } 

      $comments = htmlentities(trim($_POST['comments'])); 
      $category = htmlentities(trim($_POST['category'])); 

      if($file['name'] != ""){ 
       $training->uploadDocument($fileName, $category, $comments); 
      } 
     } 
    } 
    ?> 

    <?php 
    function convert_files($files) { 
     if (is_array($files) && !empty($files["name"])) { 
      if (is_array($files["name"])) { 
       $merged = array(); 
       foreach($files["name"] as $i => $name) { 
        $merged[] = array(
         "name" => $name, 
         "type" => $files["type"][$i], 
         "size" => $files["size"][$i], 
         "error" => $files["error"][$i], 
         "tmp_name" => $files["tmp_name"][$i] 
        ); 
       } 
       return $merged; 
      } 
      return array($files); 
     } 
     return false; 
    } 
    ?> 

编辑:添加HTML

<div id="uploadFormContainer"> 
    <form id="uploadForm" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post" enctype="multipart/form-data"> 

     <?php 
     $num = 0; 
     while($num < $maxUploads) 
     {?> 
      <div class="uploadFormE"> 
       <label>File Category: </label> 
       <select name="category"> 
        <option value="doc">Documents (pages, word, PDF etc)</option> 
        <option value="sheet">Spreadsheet</option> 
        <option value="vid">Video</option> 
        <option value="pres">Presentations</option> 
        <option value="img">Image</option> 
        <option value="quiz">Quiz</option> 
        <option value="other">Other</option> 
       </select> 
      </div> 
      <div class="uploadFormE"> 
       <label>File Location: </label> 
       <input type="file" name="myTrainingFile[]" /> 
      </div> 
      <div class="uploadFormE"> 
       <label>Comments: </label> 
       <textarea class="GAH" name="comments"> </textarea> 
      </div> 
      <hr/> 
      <br /> 
     <?php $num++; 
     } 
     ?> 

     <input type="submit" value="Upload File(s)"> 
    </form> 
    </div> 
+0

你需要对每个文件上传评论和类别? – Maximus2012

+0

@ Maximus2012 - 理想情况是。那么,类别是绝对必要的,评论不是一个巨大的考验,但是可取的 – null

回答

1

见,如果这个工程。这是的情况下,只有一个注释,类别:既然你得到的只有一个值

if ($files = convert_files($_FILES["myTrainingFile"])) { 
    foreach($files as $i => $file) { 

采取这一部分:

$comments = htmlentities(trim($_POST['comments'])); 
$category = htmlentities(trim($_POST['category'])); 

出foreach循环评论和类别从上一页,你不需要这在foreach循环。此外,如果您希望上传每个文件的评论和类别,则需要更改将值传递到此页面的上一页。如果你想要,那么你需要添加更多的代码。

这些更新后,OP增加了更多的代码:

更改此:

这样:

<select name="category[]"> 

这:

<textarea class="GAH" name="comments"> </textarea> 

本:

<textarea class="GAH" name="comments[]"> </textarea> 

,然后在原来的foreach循环,改变这种:

$comments = htmlentities(trim($_POST['comments'])); 
$category = htmlentities(trim($_POST['category'])); 

这样:

$comments = htmlentities(trim($_POST['comments'][$i])); 
$category = htmlentities(trim($_POST['category'][$i])); 

这是基于$ i是指数变量,其值的假设在遍历文件数组时,从0到4。如果不是这种情况,那么你需要添加另一个索引变量说$ count像这样:

$count = 0; 
foreach($files as $i => $file) { 
    // your other code goes here 
    $comments = htmlentities(trim($_POST['comments'][$count])); 
    $category = htmlentities(trim($_POST['category'][$count])); 

    $count ++; 
} 
+0

这是一个单页脚本Maximus,不知道这是否会产生巨大的差异,所有的HTML和PHP代码都在这一页上。我需要做出什么样的改变才能为每个上传的文件发表评论和评论?我可以以某种方式将它们追加到名称数组中吗? – null

+0

这是从哪里来的:$ _POST ['comments']?如果它的单页脚本,然后你可以发布该页面的整个代码? – Maximus2012

+0

我将用更多的HTML更新问题。另外,我需要他们在循环中。 training-> uploadDocument函数调用将它们作为参数,并且需要在forEach中运行。 – null