加载多个文件背后的php机制

加载多个文件背后的php机制,php,html,Php,Html,我正在做一个多文件上传表单,在这个网站的帮助下我成功地制作了它。现在我需要知道并理解它是如何工作的,这样我就不必只是复制代码了 我们有一个用于上传HTML的输入: <input type="file" name="file[]" multiple /> name=“file[]”中的括号如何为这样的数组创建第三维?我更愿意想象这样的场景:$\u FILES['file[$I]]['tmp\u name']。为什么没有他们就不行呢? 谢谢大家! 由于您正在上载(可能)多个文件,因此必

我正在做一个多文件上传表单,在这个网站的帮助下我成功地制作了它。现在我需要知道并理解它是如何工作的,这样我就不必只是复制代码了

我们有一个用于上传HTML的输入:

<input type="file" name="file[]" multiple />
name=“file[]”中的括号如何为这样的数组创建第三维?我更愿意想象这样的场景:$\u FILES['file[$I]]['tmp\u name']。为什么没有他们就不行呢? 谢谢大家!

由于您正在上载(可能)多个文件,因此必须有正确保存它们的方法

所以系统是这样的:

$_FILES: 
The superglobal where the FILES will be saved
举个例子:

array(1) {
    ["files"]=>array(2) {
        ["tmp_name"]=>array(2) {
            [0]=>string(9)"file0.txt"
            [1]=>string(9)"file1.txt"
        }
        ["type"]=>array(2) {
            [0]=>string(10)"text/plain"
            [1]=>string(10)"text/html"
        }
    }
}

希望它清晰易懂

它遵循所有其他名称的模式:如果在名称后面附加
[]
,PHP将为您创建一个数组。就这么简单

/foo.php?bar[]=baz&bar[]=42
这将导致:

$_GET['bar'][0] = 'baz'
$_GET['bar'][1] = '42'
表单输入也一样:

<input name="foo[]">
$\u文件
的唯一区别是结构稍微不直观。这不是:

$_FILES['foo'][0]['tmp_name']
$_FILES['foo'][0]['name']
$_FILES['foo'][1]['tmp_name']
$_FILES['foo'][1]['name']
...
但事实是:

$_FILES['foo']['tmp_name'][0]
$_FILES['foo']['name'][0]
$_FILES['foo']['tmp_name'][1]
$_FILES['foo']['name'][1]

事情就是这样。是的,这个API本来可以设计得更好,但是很多PHP也可以设计得更好。

$\u如果HTML表单字段不是数组,那么文件已经填充了二维。如果将HTML输入字段也设置为数组,则PHP会在计数器方面添加第三维。考虑到这一点,使用
[$file[$i]]
的计数引用毫无意义。你不能从中提取有意义的数据,也没有意义。我想我没想到那个水槽。但是我需要知道为什么“name[]”有效,而“name”不应该写像$_FILES['file['.$i.]']][]这样的东西。(抱歉重复评论)PHP设计完美,这就是为什么每个人都喜欢它!PHP的设计清晰易懂,但这些都是我所知道的。无论如何,谢谢你,这是一个很好的思想更新D
$_GET['bar'][0] = 'baz'
$_GET['bar'][1] = '42'
<input name="foo[]">
$_POST['foo'][..]
$_FILES['foo'][0]['tmp_name']
$_FILES['foo'][0]['name']
$_FILES['foo'][1]['tmp_name']
$_FILES['foo'][1]['name']
...
$_FILES['foo']['tmp_name'][0]
$_FILES['foo']['name'][0]
$_FILES['foo']['tmp_name'][1]
$_FILES['foo']['name'][1]