subir - ¿Cómo puedo seleccionar y cargar varios archivos con HTML y PHP utilizando HTTP POST?
subir multiples archivos php (11)
Tengo experiencia haciendo esto con subidas de archivos individuales usando <input type="file">
. Sin embargo, tengo problemas para subir más de uno a la vez.
Por ejemplo, me gustaría poder seleccionar una serie de imágenes y luego subirlas al servidor, todas a la vez.
Sería genial usar un solo control de entrada de archivos, si es posible.
¿Alguien sabe cómo lograr esto? ¡Gracias!
Esto es posible en HTML5 . Ejemplo (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>
Esto es lo que parece en Chrome después de seleccionar 2 elementos en el cuadro de diálogo de archivo:
Y esto es lo que parece después de hacer clic en el botón "Subir".
Este es solo un boceto de una respuesta totalmente funcional. Consulte el Manual de PHP: manejo de cargas de archivos para obtener más información sobre el manejo adecuado y seguro de las cargas de archivos en PHP.
Hay algunas cosas que debe hacer para crear una carga de archivos múltiples, en realidad es bastante básico. No necesita usar Java, Ajax, Flash. Simplemente crea un formulario de carga de archivos normal comenzando con:
<form enctype="multipart/form-data" action="post_upload.php" method="POST">
Entonces la clave del exito;
<input type="file" name="file[]" multiple />
¡NO te olvides de los corchetes! En post_upload.php prueba lo siguiente:
<?php print_r($_FILES[''file''][''tmp_name'']); ?>
Observe que obtiene una matriz con datos tmp_name, lo que significa que puede acceder a cada archivo con un tercer par de corchetes con el ejemplo de ''número'' de archivo:
$_FILES[''file''][''tmp_name''][0]
Puede usar el contador de php () para contar la cantidad de archivos que se seleccionaron. Goodluck widdit!
Si desea seleccionar varios archivos desde el cuadro de diálogo de selección de archivos que se muestra al seleccionar navegar, en su mayoría no tiene suerte. Tendrá que usar un applet de Java o algo similar (creo que hay uno que usa un pequeño archivo flash, lo actualizaré si lo encuentro). Actualmente, una sola entrada de archivo solo permite la selección de un solo archivo.
Si está hablando sobre el uso de múltiples entradas de archivos, entonces no debería haber mucha diferencia con el uso de uno. Publica un código e intentaré ayudarte más.
Actualización: hay un método para usar un solo botón de ''navegar'' que usa flash. Nunca he usado esto personalmente, pero he leído bastante sobre él. Creo que es tu mejor oportunidad.
Si usa múltiples campos de entrada, puede establecer name = "file []" (o cualquier otro nombre). Eso los pondrá en una matriz cuando los cargues ( $_FILES[''file''] = array ({file_array},{file_array]..)
)
Solución completa en 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>
en el primero debes hacer una forma como esta:
<form method="post" enctype="multipart/form-data" >
<input type="file" name="file[]" multiple id="file"/>
<input type="submit" name="ok" />
</form>
eso es correcto . ahora agregue este código bajo su código de formulario o en la página que desee
<?php
if(isset($_POST[''ok'']))
foreach ($_FILES[''file''][''name''] as $filename) {
echo $filename.''<br/>'';
}
?>
es fácil ... terminar
hay otro cargador basado en Flash que es gratuito, Uploadify .
Holger - Motor de búsqueda Amidalla
he creado una función php que se utiliza para cargar varias imágenes, esta función puede cargar varias imágenes en una carpeta específica, así como guardar los registros en la base de datos en el siguiente código $ arrayimage es la matriz de imágenes que se envía a través de la nota de formulario que no permitirá que la carga se use en forma múltiple, pero debe crear un campo de entrada diferente con el mismo nombre que el que pueda establecer el campo de adición dinámica de la entrada de archivos al hacer clic en el botón.
$ dir es el directorio en el que desea guardar la imagen $ fields es el nombre del campo que desea almacenar en la base de datos
El campo de la base de datos debe estar en el ejemplo de formato de la matriz si tiene un almacén de imágenes de base de datos y un nombre de campo como id, nombre, dirección y luego debe publicar datos como
$fields=array("id"=$_POST[''idfieldname''], "name"=$_POST[''namefield''],"address"=$_POST[''addressfield'']);
y luego pasar ese campo a los campos de función $
$ table es el nombre de la tabla en la que desea almacenar los datos.
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
}
// la clase de imageFunctions termina aquí
Puede probar este código para insertar múltiples imágenes con su extensión. Esta función se crea para verificar archivos de imágenes. Puede reemplazar la lista de extensiones para archivos particulares en el código.
respuesta parcial: pear HTTP_UPLOAD puede ser útil http://pear.php.net/manual/en/package.http.http-upload.examples.php
hay un ejemplo completo para múltiples archivos
Tengo este bit más simple
<?php
$image1=$_FILES["file"] ["name"][0];
$image2=$_FILES["file"] ["name"][1];
$image3=$_FILES["file"] ["name"][2];
$temp1=$_FILES["file"] ["tmp_name"][0];
$temp2=$_FILES["file"] ["tmp_name"][1];
$temp3=$_FILES["file"] ["tmp_name"][2];
$image4=$_FILES["file_ot"] ["name"][0];
$image5=$_FILES["file_ot"] ["name"][1];
$temp4=$_FILES["file_ot"] ["tmp_name"][0];
$temp5=$_FILES["file_ot"] ["tmp_name"][1];
$query="INSERT INTO `vendordata`( `details`, `phone`, `email`, `driverpic`, `licensepic`, `adharcardpic`, `pancard`, `policeverification`)
VALUES (''$details'',''$phone'',''$email'',''$image1'',''$image2'',''$image3'',''$image4'',''$image5'')";
move_uploaded_file($temp1,''uploads/''.$image1);
move_uploaded_file($temp2,''uploads/''.$image2);
move_uploaded_file($temp3,''uploads/''.$image3);
move_uploaded_file($temp4,''uploads/''.$image4);
move_uploaded_file($temp5,''uploads/''.$image5);
$run=$db->query($query);
if ($run) {
echo "inserted";
}
else {
echo("Error description: " . mysqli_error($db));
}
?>
<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>
Usando FOR Loop
<?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}.";
}
}
}
?>
Usando FOREACH Loop
<?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}.";
}
}
}
?>