PHP文件上传匹配对

时间:2012-10-12 20:39:53

标签: php file-upload

我正在将一系列配对的“之前”和“之后”图像上传到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中循环使用它。

那么,在构建$ _FILES数组时,我可以指望PHP维护输入顺序还是有更好的方法来做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在php-array扩展名中强制使用数组键,例如

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]);
}

请注意,PHP有一种处理基于数组的文件上传的模式,并且必须循环['tmp_name']属性(或$ _FILES数组中的任何其他属性)。

对于您的before1before2等版本,您还可以执行类似

的操作
$keys = preg_grep('/^after\d+$/', array_keys($_FILES['before']['tmp_name']));

它会给你数组:

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

答案 1 :(得分:0)

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