如何使用 HTTPPOST 使用 HTML 和 PHP 选择和上传多个文件?

我有使用 <input type="file">进行单文件上传的经验。但是,我在一次上传多个文件时遇到了麻烦。

例如,我希望选择一系列图像,然后将它们上传到服务器,一次性完成。

如果可能的话,最好使用单个文件输入控件。

有人知道怎么做吗?

380162 次浏览

部分答案: pear HTTP _ UPLOAD 可能很有用 Http://pear.php.net/manual/en/package.http.http-upload.examples.php

有一个关于多个文件的完整示例

如果您希望从选择浏览时显示的文件选择器对话框中选择多个文件,那么您基本上是不走运的。您将需要使用一个 Javaapplet 或类似的东西(我认为有一个使用一个小闪存文件,我会更新,如果我找到它)。目前,单个文件输入只允许选择单个文件。

如果您正在讨论使用多个文件输入,那么使用一个输入应该没有太大区别。发布一些代码,我将尝试进一步帮助。


更新: 有一种方法可以使用一个使用 flash 的“浏览”按钮。我个人从来没有用过这个,但是我读过很多关于它的报道。我认为这是你最好的机会。

Http://swfupload.org/

如果使用多个输入字段,可以设置 name = “ file []”(或任何其他名称)。这将在您上传它们时将它们放在一个数组中($_FILES['file'] = array ({file_array},{file_array]..))

这在 HTML5中是可能的。示例(PHP 5.4) :

<!doctype html>
<html>
<head>
<title>Test</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="my_file[]" multiple>
<input type="submit" value="Upload">
</form>
<?php
if (isset($_FILES['my_file'])) {
$myFile = $_FILES['my_file'];
$fileCount = count($myFile["name"]);


for ($i = 0; $i < $fileCount; $i++) {
?>
<p>File #<?= $i+1 ?>:</p>
<p>
Name: <?= $myFile["name"][$i] ?><br>
Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
Type: <?= $myFile["type"][$i] ?><br>
Size: <?= $myFile["size"][$i] ?><br>
Error: <?= $myFile["error"][$i] ?><br>
</p>
<?php
}
}
?>
</body>
</html>

下面是在文件对话框中选择了两个项目之后,Chrome 浏览器的效果:

chrome multiple file select

下面是点击“上传”按钮后的效果。

submitting multiple files to PHP

这只是一个完全可行的答案的草图。有关在 PHP 中正确、安全地处理文件上传的更多信息,请参见 PHP 手册: 处理文件上传

Firefox 5的完整解决方案:

<html>
<head>
</head>
<body>
<form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" >
<input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input>
</form>


<?php
echo "No. files uploaded : ".count($_FILES['infile']['name'])."<br>";




$uploadDir = "images/";
for ($i = 0; $i < count($_FILES['infile']['name']); $i++) {


echo "File names : ".$_FILES['infile']['name'][$i]."<br>";
$ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1);


// generate a random new file name to avoid name conflict
$fPath = md5(rand() * time()) . ".$ext";


echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>";
$result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);


if (strlen($ext) > 0){
echo "Uploaded ". $fPath ." succefully. <br>";
}
}
echo "Upload complete.<br>";
?>


</body>
</html>

创建一个多文件上传需要做一些事情,实际上这是非常基本的。你不需要使用 Java,Ajax,Flash。只需构建一个普通的文件上传表单:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

然后是成功的关键;

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

不要忘记那些括号! 在 post _ upload.php 中尝试以下操作:

<?php print_r($_FILES['file']['tmp_name']); ?>

注意,您得到了一个包含 tmp _ name 数据的数组,这意味着您可以使用文件‘ number’示例中的第三对括号来访问每个文件:

$_FILES['file']['tmp_name'][0]

您可以使用 php count ()来计算所选文件的数量!

首先,你应该这样做:

<form method="post" enctype="multipart/form-data" >
<input type="file" name="file[]" multiple id="file"/>
<input type="submit" name="ok"  />
</form>

这是正确的。现在添加这个代码在您的形式代码或在任何您喜欢的页面

<?php
if(isset($_POST['ok']))
foreach ($_FILES['file']['name'] as $filename) {
echo $filename.'<br/>';
}
?>

很简单... 完成

我已经创建了一个 php 函数,用于上传多个图像, 这个功能可以上传多个图像在特定的文件夹,以及它可以保存到数据库的记录 在下面的代码中 $arrayimage 是通过表单发送的图像数组 请注意,它不允许上传使用多个,但你需要创建不同的输入字段相同的名称将你可以设置动态添加字段的文件取消放在按钮上点击。

$dir 是要保存映像的目录 $fields 是要存储在数据库中的字段的名称

数据库字段必须采用数组格式 例子 如果您有数据库图像存储和字段名称,如 id,名称,地址,那么您需要发布数据,如

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

然后将该字段传递给函数 $fields

$table 是要在其中存储数据的表的名称。

function multipleImageUpload($arrayimage,$dir,$fields,$table)
{
//extracting extension of uploaded file
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $arrayimage["name"]);
$extension = end($temp);


//validating image
if ((($arrayimage["type"] == "image/gif")
|| ($arrayimage["type"] == "image/jpeg")
|| ($arrayimage["type"] == "image/jpg")
|| ($arrayimage["type"] == "image/pjpeg")
|| ($arrayimage["type"] == "image/x-png")
|| ($arrayimage["type"] == "image/png"))


//check image size


&& ($arrayimage["size"] < 20000000)


//check iamge extension in above created extension array
&& in_array($extension, $allowedExts))
{
if ($arrayimage["error"] > 0)
{
echo "Error: " . $arrayimage["error"] . "<br>";
}
else
{
echo "Upload: " . $arrayimage["name"] . "<br>";
echo "Type: " . $arrayimage["type"] . "<br>";
echo "Size: " . ($arrayimage["size"] / 1024) . " kB<br>";
echo "Stored in: ".$arrayimage['tmp_name']."<br>";


//check if file is exist in folder of not
if (file_exists($dir."/".$arrayimage["name"]))
{
echo $arrayimage['name'] . " already exists. ";
}
else
{
//extracting database fields and value
foreach($fields as $key=>$val)
{
$f[]=$key;
$v[]=$val;
$fi=implode(",",$f);
$value=implode("','",$v);
}
//dynamic sql for inserting data into any table
$sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')";
//echo $sql;
$imginsquery=mysql_query($sql);
move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']);
echo "<br> Stored in: " .$dir ."/ Folder <br>";


}
}
}
//if file not match with extension
else
{
echo "Invalid file";
}
}
//function imageUpload ends here
}

//image 函数类在这里结束

您可以尝试此代码插入多个图像及其扩展名此函数是为检查图像文件而创建的,您可以在代码中替换特定文件的扩展名列表

<form action="" method="POST" enctype="multipart/form-data">
Select image to upload:
<input type="file"   name="file[]" multiple/>
<input type="submit" name="submit" value="Upload Image" />
</form>

使用 FOR 循环

<?php
$file_dir  = "uploads";
if (isset($_POST["submit"])) {


for ($x = 0; $x < count($_FILES['file']['name']); $x++) {


$file_name   = $_FILES['file']['name'][$x];
$file_tmp    = $_FILES['file']['tmp_name'][$x];


/* location file save */
$file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */


if (move_uploaded_file($file_tmp, $file_target)) {
echo "{$file_name} has been uploaded. <br />";
} else {
echo "Sorry, there was an error uploading {$file_name}.";
}


}
}
?>

使用 FOREACH 循环

<?php
$file_dir  = "uploads";
if (isset($_POST["submit"])) {


foreach ($_FILES['file']['name'] as $key => $value) {


$file_name   = $_FILES['file']['name'][$key];
$file_tmp    = $_FILES['file']['tmp_name'][$key];


/* location file save */
$file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */


if (move_uploaded_file($file_tmp, $file_target)) {
echo "{$file_name} has been uploaded. <br />";
} else {
echo "Sorry, there was an error uploading {$file_name}.";
}


}
}
?>