2015-10-06 90 views
0

我有一个有两个上传字段的表单。每个字段只允许上传一个文件,并且它们都具有适当的JavaScript验证。然后我来到了我的ajax函数中,我收集表单数据并发送给PHP。目前,我做这样的事情PHP处理文件上传

submitHandler: function (form) { 
    formData = new FormData(), 
    fileOne = $(form).find('[name="fileOne"]')[0].files, 
    fileTwo = $(form).find('[name="fileTwo"]')[0].files; 

    if(fileOne.length != 0) { 
     $.each(fileOne, function(i, file) { 
      formData.append('fileOne-' + i, file); 
     }); 
    } 

    if(fileTwo.length != 0) { 
     $.each(fileTwo, function(i, file) { 
      formData.append('fileTwo-' + i, file); 
     }); 
    } 

    $.ajax({ 
     type: "POST", 
     url: "process.php", 
     dataType: "json", 
     data: formData, 
     mimeType: "multipart/form-data", 
     contentType: false, 
     processData: false 
    }); 
    return false; 
} 

的foreach循环也有可能不是必要的,因为每个人只能有一个文件,但我不能找到一个办法做到这一点没有这个循环。

反正,所以这个数据被发送到我的PHP文件。这很重要,两个文件都不是必需的,只有一个是必需的。但是,如果他们也想上传2个文件,也可以上传。所以PHP可能会收到一个或两个文件。

在我的PHP中,我需要上传文件。目前我做这个

if (!empty($_FILES)) { 
    foreach($_FILES as $file) { 
     $upload = UPLOAD\Upload::factory('/temp'); 

     $upload->file($file); 

     $upload->set_max_file_size(2); 

     $upload->set_allowed_mime_types(
      array(
       'image/bmp', 
       'image/jpeg', 
       'image/pjpeg', 
       'image/png', 
       'image/tiff', 
       'application/pdf' 
      ) 
     ); 

     $results = $upload->upload(); 

     if(!$upload->get_errors()) { 
      array_push($fileNames, $results['full_path']); 
     } 
     else { 
      var_dump("Bad File"); 
     } 
    } 
} else { 
    $errors['file'] = '- Please upload a file'; 
} 

我收集的文件名到一个数组,因为文件被上传后,我需要的文件,并把它们插入到文档中。

无论如何,我现在的主要问题是这样的。说$ _FILES包含这两个文件。它执行第一个循环,一切正常,文件被上传。然后执行第二个循环,上传出现问题,并返回错误。如果其中一个文件没有正确上传,我不想继续将其上传的文件放入文档中。如果其中一个文件失败,则应停止整个过程,并向用户返回错误。

我该如何检查上传的所有文件是否上传都没有问题?我明明已经告诉我,如果有在上传

$upload->get_errors() 

一个错误,但因为这是在循环中,我不知道如何最好地利用它的下面。

无论如何,我的主要目标是这样的。文件被上传,我收集文件名。如果一切顺利,我将这些文件名传递给一个函数,以便将它们附加到文档中。这应该只会发生,虽然上传的一个或两个文件都正确上传。

希望我已经解释了我自己够好,真的想找一点指导如何最好地处理这个问题。

感谢

+0

做一个'break'如果出现错误 –

回答

1

您没有说明长什么样你正在使用的库....像这样的,但我“不能确定:

https://github.com/aivis/PHP-file-upload-class/blob/master/upload.php

看起来像这样的事情会工作..

if ($results["status"] == false){ break; }

+0

对不起,是的,这是我使用的库。问题在于我需要将我的调用放到函数中,我将这些文件附加到循环外的文档中,否则可能会调用两次。这段代码在index.php中,因此是过程式的(不是类),所以我不能设置一个类变量来检查结果。 –

+0

对不起,我真的不明白你在说什么。您可以访问$ results [“status”]中的结果,break会停止foreach循环。 – hendr1x