我目前正在使用以下表单成功上传单个文件:
<html>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
使用以下脚本:
<?php
error_reporting(E_ALL);
if (($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"]);
if ($moved) {
echo "Move: Success <br/>";
}
else {
echo "Move Failed <br/>";
}
echo "Stored in: " . "C:/inetpub/wwwroot/PHP_Ramp/upload/" . $_FILES["file"]["name"];
}
}
else
{
echo "Invalid file";
}
?>
我现在试图让用户从表单中选择三个不同的文件。我找到了一些指南,展示了如何做类似的事情,但我无法让它发挥作用。
我已按如下方式修改表格(包括三个输入):
<html>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="file" name="file" id="file" />
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
但我不确定如何修改php以处理所有三个文件。我知道我需要遍历_FILES,但我尝试过的所有东西都不起作用。任何指针都会受到赞赏。
答案 0 :(得分:7)
每个文件元素必须具有唯一的名称,或者使用PHP的数组简写:
<input type="file" name="file1" />
<input type="file" name="file2" />
或
<input type="file" name="file[]" />
<input type="file" name="file[]" />
请记住 - name
属性定义了如何在服务器上标识该字段,如果多次使用相同的名称,PHP将使用最新的副本覆盖以前的副本,因为它会解析提交的数据。数组表示法([]
)告诉PHP你有多个具有相同名称的字段,并且它找到的每个副本都应该添加到一个数组中,而不是被覆盖。
对于唯一名称版本,您可以使用单个文件处理每个名称。
对于阵列版本,PHP具有设计愚蠢,需要稍微不同的处理。最终得到一个看起来像
的$ _FILES数组$_FILES = array(
'fieldname' => array(
'name' => array(
0 => 'first file',
1 => 'second file',
etc...
)
)
)
答案 1 :(得分:4)
您需要更改
<input name="file" />
到
<input name="file[]" />
将它们变成数组。
然后在您的脚本中,将它们引用为:
$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file
请注意,您可以将名称替换为您通常在单个文件上使用的任何其他文件属性(例如,大小,类型等)。
或者,你可以给他们所有不同的名字:
<input name="firstfile" />
<input name="secondfile" />
然后在你的剧本中:
$_FILES['firstfile']; // first file
$_FILES['secondfile']; // second file
答案 2 :(得分:1)
您可以在单个输入中选择多个文件,如下所示..
<input type="file" name="pic[]" id="pic" accept="image/*" multiple="multiple"/>
此输入框可以通过按控制键接受多个文件。现在你可以像这样访问它们
$_FILES['file']['name'][0]; // first file
$_FILES['file']['name'][1]; // second file
答案 3 :(得分:0)
您需要将HTML端的name
属性值更改为file[]
,然后在PHP中迭代$_FILES['files']
并像往常一样处理每个元素文件。
答案 4 :(得分:0)
KISS Code有一些解释:
下面有完整功能的简单代码可帮助您入门。你可以在简单的工作之后添加错误检查,最大尺寸等等。
$ _FILES数组是PHP内置的三维数组,就是存储所有上传文件信息的地方。
HTML INPUT标记的每个'name ='部分只有一个元素。
所以如果你的INPUT标签是这样的:
<INPUT name="InpFile[]" type="file" />
$ _FILES数组将有一个名为'InpFile'的顶级数组元素。
还要注意InpFile之后的[] .....告诉PHP每次使用带有相同'name'的输入标签时,它会将它添加到同一个$ _FILES数组顶部元素。
在这一个元素中,还有5个其他数组元素,其名称为:'name','type','tmp_name','error'和'size'。
每个数组元素都将包含上传的每个文件的数据。
您首次上传的文件名将位于$ _FILES ['InpFile'] ['name'] ['0']
关于你的第一个上传文件的其他信息也将以相同的方式在数组中,例如第一个文件的大小将在$ _FILES ['InpFile'] ['size'] ['0']中
每个后续文件名都在$ _FILES ['InpFile'] ['name'] [1],$ _FILES ['InpFile'] ['name'] [2] .... etc
上传后,每个文件都会在$ _FILES ['InpFile'] ['tmp_name'] [0 ... n]元素中有一个随机临时名称,这是用于首次上传文件的名称到临时区域。
因此,上传后,您必须将文件从临时区域移动到您想要的位置。
这是通过以下声明完成的:
move_uploaded_file($_FILES['InpFile']['tmp_name'][$Key],
$_FILES['InpFile']['name'][$Key] )
or die("Move from Temp area failed");
在下面的foreach语句中,$ Key和$ Name仅在那里,因此每次迭代都会为$ Key分配增加的数字...即。 0,1,2 .....等,然后你可以使用$ Key来引用数组中每个文件的名称,tmp_name等。
此代码允许您在一个页面上完成所有操作,因为表单实际上会调用自己(action =“”)来发布。所以第一次加载页面时,你会在php代码中出错,因为$ _FILES尚未设置......所以所有代码都在If语句中:If($ _FILES)。< / p>
提交表单后,它会执行此操作,然后在每个文件移动到您的区域后回显每个文件的状态。
此外,此代码会将文件上传到页面所在的同一目录...您可以使用SO上其他帖子的信息更改所有内容。
<FORM action="" method="post" enctype="multipart/form-data">
<P align="center"><B>Choose Files</B><BR>
<BR>
File One:
<INPUT name="InpFile[]" type="file" />
<BR>
<BR>
File Two:
<INPUT name="InpFile[]" type="file" />
<BR>
</P>
<P align="center"><BR>
<INPUT type="submit" name="submit" value="UpLoad">
</P>
</FORM>
<H3 align="center"> </H3>
<H3 align="center">Status:</H3>
<P align="center"> </P>
<P align="center">
将此PHP代码放在同一页面上:
<?php
If ($_FILES) {
foreach ($_FILES ['InpFile']['name'] as $Key => $Name) {
move_uploaded_file(
$_FILES['InpFile']['tmp_name'][$Key],
$_FILES['InpFile']['name'][$Key]
) or die("Move from Temp area Failed");
$EFileName = $_FILES['InpFile']['name'][$Key];
echo "<P>$EFileName: Uploaded";
}
}
?>