简体   繁体   English

PHP上传多个文件只上传1个文件

[英]PHP Upload multiple files only upload 1 file

i edited this code alot of times (im noob whit php) and my problem is upload multiples files with this code .我多次编辑此代码(我是php 菜鸟) ,我的问题是使用此代码上传多个文件 i can upload only 1 file.我只能上传 1 个文件。

Here is the code:这是代码:

<?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>

please help me understand... i know i must use foreach请帮助我理解...我知道我必须使用foreach

You should use the file field as an array like file[]您应该将文件字段用作像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>

Change the code as above and try如上更改代码并尝试

As others have pointed out, you need to change your upload field name to ie.正如其他人指出的那样,您需要将上传字段名称更改为 ie。 files[] (include the sqaure brackets after the name). files[](包括名称后的方括号)。 This is relevant as it tells PHP that it should treat the field as an array.这是相关的,因为它告诉 PHP 它应该将该字段视为一个数组。

Additionally, in the code, you may use foreach() to access the uploaded files like this:此外,在代码中,您可以使用 foreach() 访问上传的文件,如下所示:

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

(obviously, yout html field would be names field_name[] in this case) This will return one array in each of its five iterations, giving you information about all the files you've sent. (显然,在这种情况下,您的 html 字段将是名称 field_name[])这将在其五次迭代中的每一次中返回一个数组,为您提供有关您发送的所有文件的信息。 For instance, if you have sent two files, it may look like this:例如,如果您发送了两个文件,它可能如下所示:

    ["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)
    }
  }

It's important to understand that PHP will categorize those not into files and then give each its properties, but rather will list the properties for all the files.理解 PHP 不会将它们分类到文件中,然后给出每个文件的属性,而是列出所有文件的属性,理解这一点很重要。

I hope it's clear now.我希望现在清楚了。

To successfully send multiple files from you're browser, you need your inputs to pass an array to PHP.要成功地从浏览器发送多个文件,您需要输入将数组传递给 PHP。 This is done by appending [] to the end of your <input> s name:这是通过将[]附加到<input>的名称末尾来完成的:

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

Processing these files is the tricky part.处理这些文件是棘手的部分。 PHP handles file uploads differently than it would handle other POST or GET data provided in an array. PHP 处理文件上传的方式不同于处理数组中提供的其他 POST 或 GET 数据。 File uploads have a metadata key inserted between the input's name, and the index of the file that was uploaded.文件上传在输入名称和上传文件的索引之间插入了一个元数据键。 So $_FILES['filesToUpload']['name'][0] will get the name of the first file, and $_FILES['filesToUpload']['name'][1] will get the name of the second file... and so on.所以$_FILES['filesToUpload']['name'][0]将获得第一个文件的名称,而$_FILES['filesToUpload']['name'][1]将获得第二个文件的名称。 .. 等等。

Because of this foreach is absolutely the wrong loop to use .因为这个foreach绝对是错误的循环使用 You will end up processing each piece of metadata on it's own, without any context.您最终将自行处理每条元数据,没有任何上下文。 That's dreafully unnatural .这太不自然了

Let's get the index of each file and process one file at a time instead.让我们获取每个文件的索引并一次处理一个文件。 We'll use a for loop for this.为此,我们将使用for循环。 This is an entirely self contained, functioning example of a user uploading multiple files to a folder on the server:这是一个完全自包含的功能示例,用户将多个文件上传到服务器上的文件夹:

<?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']['error'][$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>

To run this example, your files should look like this要运行此示例,您的文件应如下所示

在此处输入图片说明

You can startup the PHP builtin webserver with:您可以使用以下命令启动 PHP 内置网络服务器:

$ php -S localhost:8000

Then going to http://localhost:8000/sandbox.php will run the example.然后转到http://localhost:8000/sandbox.php将运行该示例。


Important note: The above example does not do any validation.重要提示:上面的例子没有做任何验证。 You will need to validate that all the uploaded files are safe.您需要验证所有上传的文件都是安全的。

You have to use foreach loop to upload multiple files.您必须使用 foreach 循环上传多个文件。 in framework also thy have provided components with same facility (ie by using foreach loop).在框架中,您还提供了具有相同功能的组件(即通过使用 foreach 循环)。

my suggestion is我的建议是

  1. Start a loop: foreach ($_FILES[$file_field] as $file) { where you have // Get filename string开始一个循环: foreach ($_FILES[$file_field] as $file) { where you have // Get filename string
  2. Close it with } in the end of the function在函数的末尾用}关闭它
  3. Change all $_FILES[$file_field] to $file inside it将所有$_FILES[$file_field]更改为其中的$file

And, of course, input must have multiple attribute as Sherin Jose said ( tut ), but now it's fully supported only by 8.27% of browsers, so you'd better add more inputs with JS, like而且,当然,输入必须有multiple属性,正如谢林·何塞所说(),但现在只有8.27%的浏览器完全支持它,所以你最好用 JS 添加更多输入,比如

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

and loop them in the same way并以相同的方式循环它们

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM