2013-07-04 86 views
1

我编辑了这段代码很多次(im noob whit php)和我的问题是用此代码上传多个文件。我只能上传1个文件。PHP上传多个文件只上传1个文件

下面是代码:

<?php 
/** 
* uploadFile() 
* 
* @param string $file_field name of file upload field in html form 
* @param bool $check_image check if uploaded file is a valid image 
* @param bool $random_name generate random filename for uploaded file 
* @return array 
*/ 
function uploadFile ($file_field = null, $check_image = false, $random_name = false) { 

    //Config Section  
    //Set file upload path 
    $path = 'c:/xampp/htdocs/'; //with trailing slash 
    //Set max file size in bytes 
    $max_size = 1000000; 
    //Set default file extension whitelist 
    $whitelist_ext = array('jpg','png','gif'); 
    //Set default file type whitelist 
    $whitelist_type = array('image/jpeg', 'image/png','image/gif'); 

    //The Validation 
    // Create an array to hold any output 
    $out = array('error'=>null); 

    if (!$file_field) { 
    $out['error'][] = "Please specify a valid form field name";   
    } 

    if (!$path) { 
    $out['error'][] = "Please specify a valid upload path";    
    } 

    if (count($out['error'])>0) { 
    return $out; 
    } 

    //Make sure that there is a file 
    if((!empty($_FILES[$file_field])) && ($_FILES[$file_field]['error'] == 0)) { 

    // Get filename 
    $file_info = pathinfo($_FILES[$file_field]['name']); 
    $name = $file_info['filename']; 
    $ext = $file_info['extension']; 

    //Check file has the right extension   
    if (!in_array($ext, $whitelist_ext)) { 
     $out['error'][] = "Invalid file Extension"; 
    } 

    //Check that the file is of the right type 
    if (!in_array($_FILES[$file_field]["type"], $whitelist_type)) { 
     $out['error'][] = "Invalid file Type"; 
    } 

    //Check that the file is not too big 
    if ($_FILES[$file_field]["size"] > $max_size) { 
     $out['error'][] = "File is too big"; 
    } 

    //If $check image is set as true 
    if ($check_image) { 
     if (!getimagesize($_FILES[$file_field]['tmp_name'])) { 
     $out['error'][] = "Uploaded file is not a valid image"; 
     } 
    } 

    //Create full filename including path 
    if ($random_name) { 
     // Generate random filename 
     $tmp = str_replace(array('.',' '), array('',''), microtime()); 

     if (!$tmp || $tmp == '') { 
     $out['error'][] = "File must have a name"; 
     }  
     $newname = $tmp.'.'.$ext;         
    } else { 
     $newname = $name.'.'.$ext; 
    } 

    //Check if file already exists on server 
    if (file_exists($path.$newname)) { 
     $out['error'][] = "A file with this name already exists"; 
    } 

    if (count($out['error'])>0) { 
     //The file has not correctly validated 
     return $out; 
    } 

    if (move_uploaded_file($_FILES[$file_field]['tmp_name'], $path.$newname)) { 
     //Success 
     $out['filepath'] = $path; 
     $out['filename'] = $newname; 
     return $out; 
    } else { 
     $out['error'][] = "Server Error!"; 
    } 

    } else { 
    $out['error'][] = "No file uploaded"; 
    return $out; 
    }  
} 
?> 
<?php 
if (isset($_POST['submit'])) { 
    $file = uploadFile('file', true, true); 
    if (is_array($file['error'])) { 
    $message = ''; 
    foreach ($file['error'] as $msg) { 
     $message .= '<p>'.$msg.'</p>';  
    } 
    } else { 
    $message = "File uploaded successfully"; 
    } 
    echo $message; 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
<input name="file" type="file" size="20" multiple="multiple" /> 
<input name="submit" type="submit" value="Upload files" /> 
</form> 

请帮助我理解......我知道我必须使用的foreach

回答

0

你必须使用foreach循环来上传多个文件。在框架中,您也提供了具有相同功能的组件(即通过使用foreach循环)。

5

您需要声明文件中的字段作为一个数组一样file[]

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> 
<input name="file[]" type="file" size="20" multiple="multiple" /> 
<input name="submit" type="submit" value="Upload files" /> 
</form> 

然后尝试

+0

多个仍然不需要完全HTML5的'multiple ='multiple''只''multiple'就够了,[proof](http://www.w3schools.com/tags/att_input_multiple.asp) – vladkras

+0

U r正确.. @ vladkras –

+0

也可以使用'[]'为多个字段具有相同的名称,但你不需要它,当你使用'multiple'属性只有一个字段 – vladkras

1

正如其他人所指出的那样,你需要上传字段名称更改为即。文件[](包括名称后面的方括号)。这是相关的,因为它告诉PHP它应该将该字段视为一个数组。

此外,在代码中,你可以使用的foreach()来访问上传的文件是这样的:

foreach ($_FILES['field_name'] as $file) 

(显然,YOUT HTML字段将名称FIELD_NAME []在这种情况下) 这将在五次迭代中每次都返回一个数组,为您提供有关您发送的所有文件的信息。例如,如果您发送两个文件,它可能是这样的:

["name"]=> 
    array(2) { 
     [0]=> 
     string(5) "dir.c" 
     [1]=> 
     string(10) "errcodes.h" 
    } 
    ["type"]=> 
    array(2) { 
     [0]=> 
     string(11) "text/x-csrc" 
     [1]=> 
     string(11) "text/x-chdr" 
    } 
    ["tmp_name"]=> 
    array(2) { 
     [0]=> 
     string(14) "/tmp/phpP1iz5A" 
     [1]=> 
     string(14) "/tmp/phpf31fzn" 
    } 
    ["error"]=> 
    array(2) { 
     [0]=> 
     int(0) 
     [1]=> 
     int(0) 
    } 
    ["size"]=> 
    array(2) { 
     [0]=> 
     int(511) 
     [1]=> 
     int(38) 
    } 
    } 

重要的是要明白,PHP将归类那些不进的文件,然后给它的各个属性,而是将列出所有属性文件。

我希望现在很清楚。

0

我的建议是

  1. 开始一个循环:foreach ($_FILES[$file_field] as $file) {,你必须// Get filename
  2. 关闭它}在函数结束
  3. 更改所有$_FILES[$file_field]$file里面

而且,当然,输入必须具有multiple属性为谢林何塞说(tut),但现在它完全通过浏览器的8.27%唯一支持的,所以你最好用JS增加更多的投入,像

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

和循环他们以同样的方式

0

要成功发送来自您的浏览器的多个文件,您需要输入以将数组传递给PHP。这是通过附加[]<input>名字的最后完成:

<input type="file" name="filesToUpload[]" multiple> 

处理这些文件是棘手的部分。 PHP处理文件上传的方式与处理数组中提供的其他POST或GET数据的方式不同。文件上传在输入名称和已上传文件的索引之间插入了一个元数据密钥。因此$_FILES['filesToUpload']['name'][0]将获得第一个文件的名称,而$_FILES['filesToUpload']['name'][1]将获得第二个文件的名称......等等。

因此foreach绝对是错误的循环使用。您将最终处理它自己的每个元数据,而无需任何上下文。 这很不自然

让我们来获取每个文件的索引,然后逐个处理一个文件。我们将为此使用for循环。这是一个完全独立的,运作的多个文件上传到一个文件夹中的服务器上的用户的例子:

<?php 
/* 
* sandbox.php 
*/ 

if (isset($_POST['submit'])) { 

    // We need to know how many files the user actually uploaded. 
    $numberOfFilesUploaded = count($_FILES['filesToUpload']['name']); 

    for ($i = 0; $i < $numberOfFilesUploaded; $i++) { 
     // Each iteration of this loop contains a single file. 
     $fileName = $_FILES['filesToUpload']['name'][$i]; 
     $fileTmpName = $_FILES['filesToUpload']['tmp_name'][$i]; 
     $fileSize = $_FILES['filesToUpload']['size'][$i]; 
     $fileError = $_FILES['filesToUpload']['name'][$i]; 
     $fileType = $_FILES['filesToUpload']['type'][$i]; 

     // PHP has saved the uploaded file as a temporary file which PHP will 
     // delete after the script has ended. 
     // Let's move the file to an output directory so PHP will not delete it. 
     move_uploaded_file($fileTmpName, './output/' . $fileName); 
    } 
} 

?> 

<form method="post" enctype="multipart/form-data"> 
           <!-- adding [] Allows us to upload multiple files --> 
    <input type="file" name="filesToUpload[]" multiple> 
    <input type="submit" name="submit"/>Submit 
</form> 

要运行这个例子,你的文件应该是这样的

enter image description here

可以启动与PHP Web服务器内置:

$ php -S localhost:8000 

然后去http://localhost:8000/sandbox.php将运行该示例。


重要提示:上面的例子并不做任何验证。您需要验证所有上传的文件是否安全。