PHP文件上载匹配对

PHP文件上载匹配对,php,file-upload,Php,File Upload,我正在将一系列成对的“before”和“after”图像上传到一个PHP脚本中。在处理上传时,我必须确保正确的“之前”和“之后”图像是匹配的 如果我只是这样做: before: <input type="file" name="image[]"> after: <input type="file" name="image[]"> before: <input type="file" name="image[]"> after: <input type

我正在将一系列成对的“before”和“after”图像上传到一个PHP脚本中。在处理上传时,我必须确保正确的“之前”和“之后”图像是匹配的

如果我只是这样做:

before: <input type="file" name="image[]">  after: <input type="file" name="image[]">
before: <input type="file" name="image[]">  after: <input type="file" name="image[]">
之前:之后:
之前:之后:
然后循环遍历image[]数组,我可以依靠PHP来维持正确的顺序吗

同样的问题也适用于我想如果我把它改成这样:

before: <input type="file" name="before[]">  after: <input type="file" name="after[]">
before: <input type="file" name="before[]">  after: <input type="file" name="after[]">
之前:之后:
之前:之后:
在这里,我仍然需要确保before[]数组和after[]数组是有序的,而且现在我必须在任何循环中协调这两个数组

或者我也可以这样做

before: <input type="file" name="before1">  after: <input type="file" name="after1">
before: <input type="file" name="before2">  after: <input type="file" name="after2">
etc....
之前:之后:
之前:之后:
等
(可能是我在.net中所做的),但我不太确定如何在PHP中循环使用它

那么,在构建$\u文件数组时,我可以指望PHP维护输入顺序吗?或者有更好的方法来做到这一点吗


谢谢

您可以强制php数组扩展中的数组键,例如

name="before[1]"     name="after[1]"
name="before[2]"     name="after[2]"
PHP将在处理表单数据时使用这些键创建数组条目

或者,您可以简单地使用以下内容

foreach(array_keys($_FILES['before']['tmp_name'])) as $key) {
    processFile($_FILES['before']['tmp_name'][$key]);
    processFile($_FILES['after']['tmp_name'][$key]);
}
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));
请注意,PHP处理基于数组的文件上载的方式很愚蠢,必须循环使用
['tmp\u name']
属性(或$\u FILES数组中的任何其他属性)

对于您的
before1
before2
等。。。版本,您还可以执行以下操作

foreach(array_keys($_FILES['before']['tmp_name'])) as $key) {
    processFile($_FILES['before']['tmp_name'][$key]);
    processFile($_FILES['after']['tmp_name'][$key]);
}
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));
这将为您提供阵列:

 $keys = array(
    0 => 'after1',
    1 => 'after2', 
    ...
 )

您可以强制php数组扩展中的数组键,例如

name="before[1]"     name="after[1]"
name="before[2]"     name="after[2]"
PHP将在处理表单数据时使用这些键创建数组条目

或者,您可以简单地使用以下内容

foreach(array_keys($_FILES['before']['tmp_name'])) as $key) {
    processFile($_FILES['before']['tmp_name'][$key]);
    processFile($_FILES['after']['tmp_name'][$key]);
}
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));
请注意,PHP处理基于数组的文件上载的方式很愚蠢,必须循环使用
['tmp\u name']
属性(或$\u FILES数组中的任何其他属性)

对于您的
before1
before2
等。。。版本,您还可以执行以下操作

foreach(array_keys($_FILES['before']['tmp_name'])) as $key) {
    processFile($_FILES['before']['tmp_name'][$key]);
    processFile($_FILES['after']['tmp_name'][$key]);
}
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));
这将为您提供阵列:

 $keys = array(
    0 => 'after1',
    1 => 'after2', 
    ...
 )

当您使用name字段创建一个数组时,如您在示例中所示,PHP将按照表单中提交的顺序提供一个数组。请注意,您本质上相信用户的输入。也就是说,如果有任何东西(例如恶意创建的表单或XSS注入)改变了您的表单并发布,那么您的数据顺序可能会改变。这与任何其他类型的表单操纵的风险相同。因此,PHP不应该弄乱它,但黄金法则是不信任用户输入。

当您使用name字段创建一个数组时,如您在示例中所示,PHP将按照表单中提交的顺序提供一个数组。请注意,您本质上相信用户的输入。也就是说,如果有任何东西(例如恶意创建的表单或XSS注入)改变了您的表单并发布,那么您的数据顺序可能会改变。这与任何其他类型的表单操纵的风险相同。因此,PHP不应该弄脏它,但黄金法则是不信任用户输入