Te he preparado un ejemplo muy básico usando la estructura general que tengo para la subida de archivos de mis proyectos:
Archivo
Ejemplo-files.html
Código HTML:
Ver original <meta name="viewport" content="width=device-width, initial-scale=1.0"> <form enctype="multipart/form-data" method="POST" action="Uploads.php"> <input id="file-1" name="archivos[]" type="file" multiple>
Archivo
Uploads.php
el cual contiene una estructurá completa, valida si se reciben datos, valida extenciones, comprueba existencia de archivos y te da opciones de edición muy sencilla, además lo he comentado... el resultado que devuelve es un objeto JSON con todos los datos de cada archivo subido, tales como nombre, ruta donde se guardo, tamaño del archivo y si es pdf el número de páginas del mismo, así que si estas trabajando con peticiones AJAX no tienes que hacer el trabajo de construir el objeto....
espero que te sirva:
Código PHP:
Ver original<?php
//solo se puede acceder si es una peticion post
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//array de campos file del formulario
$files = $_FILES['archivos']['name'];
//creamos una instancia de la clase multiupload
$upload = new Multiupload();
//llamamos a la funcion upFiles y le pasamos el array de campos file del formulario
$isUpload = $upload->upFiles($files);
} else {
$response['code'] = -1;
$response['message'] = "No se enviaron archivos.";
}
/**
* Description of Multiupload.php
*
* @author jhonjaider1000
*/
class Multiupload {
var $directory = "uploads/"; //Directorio para guardar los archivos, si no existe el script lo crea.
var $extensiones = array("jpg", "png", "gif", "bmp", "pdf",); //Extenciones permitidas.
/**
* sube archivos al servidor a través de un formulario
* @access public
* @param array $files estructura de array con todos los archivos a subir
*/
public function upFiles
($files = array()) { //inicializamos un contador para recorrer los archivos
$i = 0;
//si no existe la carpeta, la creamos...
if (!is_dir($this->directory)) { mkdir($this->directory, 0777); if (DIRECTORY_SEPARATOR == "/") {
chmod($this->directory, 0777); }
}
$cont = 0;
//recorremos los input files del formulario
foreach ($files as $file) {
if ($_FILES['archivos']['tmp_name'][$i]) {
//separamos los trozos del archivo, nombre extension
$trozos[$i] = explode(".", $_FILES["archivos"]["name"][$i]); //obtenemos la extension
$extension[$i] = end($trozos[$i]); //SE PREPARAN LOS DETALLES DEL ARCHIVO...
$archive['datos']['rutaArchivo'] = null; //La ruta solo se parametrizará si se logra subir el archivo más adelante.
$archive['datos']['nombreArchivo'] = $_FILES['archivos']['name'][$i];
$archive['datos']['tamanioArchivo'] = $_FILES['archivos']['size'][$i];
$ext = explode('.', $_FILES['archivos']['name'][$i]); if ($ext == "pdf") {
$archive['datos']['numPages'] = getNumPagesPDF($this->directory . $_FILES['archivos']['name'][$i]);
} else {
$archive['datos']['numPages'] = 0;
}
//si la extensión es una de las permitidas
if ($this->checkExtension($extension[$i]) === TRUE) {
//comprobamos si el archivo existe o no, si existe renombramos
//para evitar que sean eliminados
$_FILES['archivos']['nameDefault'][$i] = $_FILES['archivos']['name'][$i];
$_FILES['archivos']['name'][$i] = $this->checkExists($trozos[$i]);
//comprobamos si el archivo ha subido
if (move_uploaded_file($_FILES['archivos']['tmp_name'][$i], $this->directory . $_FILES['archivos']['name'][$i])) { //Se cambian los permisos del archivo, para que se puedan editar, eliminar y demás si se está usando linux.
if (DIRECTORY_SEPARATOR == "/") {
chmod($this->directory . $_FILES['archivos']['name'][$i], 0777); }
$archive['datos']['rutaArchivo'] = $this->directory . $_FILES['archivos']['name'][$i];
//Si se desea agregar el archivo y sus detalles a la base de datos
//este sería el punto perfecto para hacerlo...
$archive['codigo'] = 1;
$archive['mensaje'] = "Se ha subido el archivo correctamente.";
//Se agrega la respuesta y detalles del archivo subido.
} else {
$archive['codigo'] = -1;
$archive['mensaje'] = "No se pudo subir el archivo.";
}
//si la extension no es una de las permitidas
} else {
$archive['codigo'] = -1;
$archive['mensaje'] = "Extención inválida.";
//ACCIÓN A EJECUTAR SI LA EXTENCIÓN ES INVÁLIDA.
}
//si ese input file no ha sido cargado con un archivo
} else {
}
//echo "<br />";
//en cada pasada por el loop incrementamos i para acceder al siguiente archivo
$i++;
}
}
/**
* funcion privada que devuelve true o false dependiendo de la extension
* @access private
* @param string
* @return boolean - si esta o no permitido el tipo de archivo
*/
private function checkExtension($extension) {
return TRUE;
} else {
return FALSE;
}
}
/**
* funcion que asigna un nombre al archivo y comprueba si existe.
* @access private
* @param array
* @return array - archivo con el nuevo nombre
*/
//Si no se desea que esta función cambie el archivo ni nada por el estilo, solo
//se debe retornar el mismo nombre recibido, aunque recomiendo que se compruebe
//la existencia del archivo y se use el $i como un modificador que le
//de un nombre de tipo file(1), file(2)...
private function checkExists($file) {
//asignamos de nuevo el nombre al archivo
$i = 0;
//mientras el archivo exista entramos
$i++;
}
return $archivo;
}
}
//Esta función retorna el número de páginas de un pdf.
function getNumPagesPDF($filePath) {
return 0;
if (!$fp = @fopen($filePath, "r")) return 0;
$i = 0;
$type = "/Contents";
$i++;
}
}
return (int) $i;
}
?>
Éxitos!