PHP - Problemas para subir Archivos al Servidor

   
Vista:
Imágen de perfil de Roberto

Problemas para subir Archivos al Servidor

Publicado por Roberto (10 intervenciones) el 26/07/2015 19:35:45
Hola a todos,

Tengo problemas para subir archivos al servidor por medio de PHP que estoy programando, ya ratos estoy buscando solución a mi problema pero sin éxito

Este es el mensaje de error:

Warning: move_uploaded_file() expects parameter 1 to be string, array given in /var/www/html/laboratorio-php/upload-form/php/subir_imagen.php on line 38

Este son mis códigos PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        // Especificar el Nombre de los Archivos 
	$nombre_archivos = $_FILES["archivos"]["name"];
	// Especificar los Nombres Temporales de los Archivos
	$nombre_temporales = $_FILES["archivos"]["tmp_name"];
	// Especificar el Tipo del Formato de los Archivos
	$tipo_formato = $_FILES["archivos"]["type"];
	// Especificar el Tamaño de los Archivos
	$tam_archivos = $_FILES["archivos"]["size"];
	//Especificar el Estado de los Archivos Subidos
	$archivos_subidos = 1;
 
	// Directorio donde se almacena los Archivos Subidos
	$directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
	// Destino de los Archivos Subidos
	$destino_archivos = $directorio.$nombre_archivos;
 
	// Especificar el Limite de Tamaño de los Archivos
	if ($tam_archivos >= 1024) {
		$tam_archivos_msg = "Lo Siento, no se permite archivos mayores de 1 MB!";
		$archivos_subidos = 0; // Para No Permitir Subir Archivos
	} else {
		move_uploaded_file($nombre_temporales,$destino_archivos);
		$archivos_subidos = 1; // Para Permitir Subir Archivos
	}
 
	// Especificar los Tipos de Formato Permitidos de los Archivos
	if ($tipo_formato != "jpg" || $tipo_formato != "jpeg" || $tipo_formato != "png"
	|| $tipo_formato != "gif" || $tipo_formato != "pdf") {
		$tipo_formato_msg = "Sólo se permite formatos JPG, JPEG, PNG, GIF y PDF!";
		$archivos_subidos = 0; // Para No Permitir Subir Archivoos
	} else {
		move_uploaded_file($nombre_temporales,$destino_archivos);
		$archivos_subidos = 1; // Para Permitir Subir Archivos
	}
 
	// Especificar Si los Archivos fueron Subidos 
	if (isset($_POST["submit"]) && move_uploaded_file($nombre_temporales,$destino_archivos)) {    // LINEA 38
		$mensaje = "Felicidades, Su Archivos fueros Subidos!";
	}
 
	// Si Ninguno de los Archivos fueron Subidos, Mostrar los Mensajes de Errores
	if ($archivos_subidos == 0) {
		echo "<p>" . $tam_archivos_msg . "</p>\n";
		echo "<p>" . $tipo_formato_msg . "</p>\n";
	} else {
		echo "<p>" . $mensaje . "</p>\n";
	}

A ver si alguien me ayuda a encontrar mi error o solución a mi problema.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 26/07/2015 22:18:41
Pues probablemente se deba a que hayas subido más de un archivo y como bien dice el error tengas un array de nombres de archivo en vez de un solo archivo subido.

Prueba a hacer un var_dump($nombre_temporales) justo antes de hacer el move_uploaded_file() y comprueba qué valores tienes en esa variable.

Si la variable $nombre_temporales no es un string deberás hacer lo propio.

PD: Si tienes más de 1 archivo (o si solo tienes 1 en un array) puedes usar foreach($nombre_temporales as $nombre_temporal) para hacer las comprobaciones de tipo de archivo o nombre por cada elemento en el array.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 26/07/2015 22:53:38
Voy a comenzar hacer las pruebas que usted me sugiere hacer, lo mantendrén al tanto de la situación.

Muchas Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto

Problemas para subir Archivos al Servidor

Publicado por Roberto (10 intervenciones) el 27/07/2015 09:54:10
Ok, principio, el formulario HTML lo tenía para subir varios archivos al mismo tiempo, pero lo cambié para que sólo permita subir un sólo archivo a la vez.

Antes estaba de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
<?php
	print "<form action='$_SERVER[PHP_SELF]' method='post' enctype='multipart/form-data'>\n";
	print "\t\t\t<fieldset>\n";
	print "\t\t\t\t<legend>Subir Archivos</legend>\n";
	print "\t\t\t\t<label for='imagen'>Seleccione un Archivo</label> <br />\n";
	print "\t\t\t\t<input type='file' name='archivos[]' size='30' multiple /> <br />\n";
	print "\t\t\t\t<input type='submit' name='submit' value='Subir Archivo' />\n";
	print "\t\t\t</fieldset>\n";
	print "\t\t</form>\n";
?>

Y ahora está de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
<?php
	print "<form action='$_SERVER[PHP_SELF]' method='post' enctype='multipart/form-data'>\n";
	print "\t\t\t<fieldset>\n";
	print "\t\t\t\t<legend>Subir Archivos</legend>\n";
	print "\t\t\t\t<label for='imagen'>Seleccione un Archivo</label> <br />\n";
	print "\t\t\t\t<input type='file' name='archivo' size='30' /> <br />\n";
	print "\t\t\t\t<input type='submit' name='submit' value='Subir Archivo' />\n";
	print "\t\t\t</fieldset>\n";
	print "\t\t</form>\n";
?>

Este cambio fue por lo que usted me dijo que "tengo un array de nombres de archivo en vez de un solo archivo subido". Bueno la verdad no sé si éste cambio que hice en el formulario tenga algo que ver con ésto.

Lo segundo que hice fue especificar el directorio temporal en php.ini para limpiar archivos temporales reiniciando luego el Servidor Web con la intención de verificar si en verdad se están almacenado dentro del directorio "/tmp".

1
upload_tmp_dir = "/tmp"

OK, luego hice lo que usted me sugerió acerca de hacer un var_dump() antes de hacer el move_uploaded_file() y al hacerlo, cuando le hago "refresh" en mi explorador, me sale como NULO o NULL. ¿Qué significa eso?

1
2
3
4
5
6
7
8
9
10
<?php
        $nombre_archivo = $_FILES['archivo']['name'];
	$nombre_temporal = $_FILES['archivo']['tmp_name'];
 
        $directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
	$destino = $directorio.$nombre_archivo;
 
        var_dump($nombre_temporal);
	move_uploaded_file($nombre_temporal,$destino);
?>

NULL-Formulario

Por último, también hice algunos cambios con mis códigos PHP para subir archivos pero me genera errores para subir archivos, probablemente ha de ser por el mismo problema del NULL que le mencioné.

Este es el cambio que hice con los códigos PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
	$nombre_archivo = $_FILES['archivo']['name'];
	$nombre_temporal = $_FILES['archivo']['tmp_name'];
	$formato_archivo = $_FILES['archivo']['type'];
	$error_subida = $_FILES['archivo']['error'];
 
	$directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
	$destino = $directorio.$nombre_archivo;
 
	if ($error_subida > 0) {
		$error_subida_msg = "Lo Siento!! Ocurri&oacute; un Error al Subir su Archivo";
		echo "<p>" . $error_subida_msg . "</p>\n";
	} else if ($formato_archivo != 'image/jpg' || $formato_archivo != 'image/jpeg' || $formato_archivo != 'image/png'
	|| $formato_archivo != 'image/gif' || $formato_archivo != 'application/pdf' || $formato_archivo != 'text/plain') {
		$formato_archivo_msg = "S&oacute;lo se permiten los formatos JPG, JPEG, PNG, GIF, PDF y TXT";
		echo "<p>" . $formato_archivo_msg . "</p>\n";
	} else if (file_exists($destino)) {
		$destino_msg = "Lo Siento!! El Archivo con ese Nombre ya Existe!";
		echo "<p>" . $destino_msg . "</p>\n";
	} else if (isset($_POST['submit'])) {
		move_uploaded_file($nombre_temporal, $destino);
		$mensaje = "Felicidades!! Su Archivo ha sido Subido Exitosamente!";
		echo "<p>" . $mensaje . "</p>\n";
	}
 
?>

Error-Subir-Archivo

Por favor ayúdame con ésto, ya que no creo que sea por algún error de lógica o error de código. Si no pues dígame usted si estoy equivocado con mi lógica o con mis códigos y en qué exactamente.

Espero su respuesta, Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 27/07/2015 10:52:36
Primero comentar que te faltan muchas comprobaciones que hacer antes de intentar subir archivos. Creo que empezando por [1]http://php.net/manual/en/features.file-upload.post-method.php, [2]http://php.net/manual/en/features.file-upload.php y [3]http://php.net/manual/en/features.file-upload.multiple.php puede ayudarte viendo los ejemplos y el código de otros.

De todas formas volviendo al tema. Si var_dump($var) devuelve NULL es porque aun no ha sido inicializada la variable o la variable ha sido inicializada como NULL. Eso significa que no has comprobado que realmente se haya subido el archivo o se haya hecho el POST correctamente.
Para comprobar que el archivo se subió correctamente se puede usar la propia función move_uploaded_file() como se comenta en el ejemplo 2 en [1], con isset() para determinar si las variables $_FILES['archivo'] han sido correctamente inicializadas, con la función is_uploaded_file() [4]http://php.net/manual/en/function.is-uploaded-file.php y con los mensajes de error y para ello necesitas mejorar la salida de errores como propone en [5]http://www.php.net/manual/en/features.file-upload.errors.php.

Para entender que hay realmente en $_FILES['archivo'] yo haria un var_dump($_FILES['archivo']). Y luego escribiría unos mensajes de error mucho más concretos para saber cuál es el fallo concreto.

Siento ser tan general =).
Espero que te ayude.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 27/07/2015 11:23:12
Muchas gracias, al parecer como que todavía me falta desarrollar mi lógica jajaja. Bueno no importa, de todas formas estoy muy agradecido contigo por tomarte las molestias en ayudarme.

Que buena información me has dado, tomaré tus consejos y te mantendré al tanto de todo esto hasta que termine de hacer todo bien para poder subir archivos al Servidor. Lo bueno de todo ésto es sólo es práctica, ¿me explico? Nada de qué preocuparme. Todo ésto es sólo una preparación porque tal vez, algún día, termine trabajando con PHP para alguien más o termine trabajando PHP para beneficio propio creando plugins y ganar algo de dinero, ¿me entiendes?

Aquí puedes observar mis ejercicios que he elaborado hasta el momento. http://murillo.homelinux.net:8282/laboratorio-php/

Bueno, no se que más decir excepto que GRACIAS TOTALES por tus consejos y ayuda, lo tomaré en cuenta.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 27/07/2015 11:29:51
Ánimo! Así es como se llega lejos! Con ganas de aprender!

Y se agradecen tus agradecimientos :)

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 29/07/2015 09:23:02
Ok Alero, soy yo de nuevo, estuve casi un día entero re-escribiendo códigos PHP para subir archivos tomando un poco de mi logica + referencias de otros programadores PHP. Hoy si ya está todo funcionando bien con mis códigos y puse ciertas condiciones por si hay problemas para subir Archivos.

Lo único que me falta es poner alguna restricción para evitar subir archivos de ciertas extensiones o formatos.

Aquí te muestro mis códigos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
	// Bloque del Formulario
	$formulario =
	"<form action='$_SERVER[PHP_SELF]' method='post' enctype='multipart/form-data'>
		\t<fieldset>
			\t\t<legend>Subir Archivos</legend>
			\t\t<label for='archivo'>Seleccione un Archivo</label>
			\t\t<input type='file' name='archivo' size='30' />
			\t\t<input type='hidden' name='operacion' value='accion' />
			\t\t<input type='submit' name='submit' value='Subir Archivo' />
		\t</fieldset>
	\t</form>\n";
 
	/* Si la accion de la operacion no es subir Archivo, 
		entonces mostrar el formulario. */
		if ($_POST['operacion'] != "accion") {
			echo $formulario; //Mostrar el Formulario
 
		/* Si la accion de la operacion es subir Archivo, 
		entonces revisar ciertas condiciones para subir Archivo. */
		} else if ($_POST['operacion'] == "accion") {
 
			// Especificar el Nombre del Archivo
			$nombre_archivo = $_FILES['archivo']['name'];
			/* Especificar el Archivo Temporal junto 
			con su Nombre Temporal antes de ser almacenado */
			$archivo_temporal = $_FILES['archivo']['tmp_name'];
			// Especificar los Errores de Carga o de la Subida del Archivo 
			$errores_subida = $_FILES['archivo']['error'];
			// Especificar el Tamaño del Archivo
			$formato_archivo = $_FILES['archivo']['size'];
 
			// Especificar la Ruta del Directorio en dónde será almacenado
			$directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
			// Especificar el Destino del Archivo cuando es almacenado 
			$destino = $directorio . basename($nombre_archivo);
 
			// Especificar el Mensaje cuando hay errores de carga del Archivo
			if (isset($_POST['submit']) && $errores_subida > 0) {
				$errores_subida_msg = "Lo Siento! Ocurri&oacute; problemas al subir su Archivo!";
				$subir_archivo = "no"; // Para Evitar subir Archivo
			}
 
			// Especificar el Mensaje cuando se pasa el Limite del Tamaño del Archivo
			if (isset($_POST['submit']) && $formato_archivo >= 1000000) {
				$formato_archivo_msg = "Lo Siento! No se puede subir Archivo que pese m&aacute;s de 1MB!";
				$subir_archivo = "no"; // Para Evitar subir Archivo
			}
 
			// Especificar el Mensaje cuando se ha subido el Archivo
			if ($subir_archivo != "no" && isset($_POST['submit'])) {
				move_uploaded_file($archivo_temporal, $destino); // Subir el Archivo
				$mensaje = "Felicidades!! Su Archivo ha sido Subido Exitosamente!";
				echo "\t\t<p>" . $mensaje . "</p>\n";
 
			// Enlace para Subir Más Archivos
				$msg_subir_archivo ="Subir Otro Archivo";
				echo "<center><a class='enlace' href='../../../laboratorio-php/upload-form/'
				title='Presionar para Subir M&aacute;s Archivos'>" . $msg_subir_archivo . "</a></center>\n";
 
			// Especificar los Mensajes de Errores si NO se puede subir Archivos
			} else if ($subir_archivo == "no") {
				echo "\t\t<p>" . $errores_subida_msg . "</p>\n";
				echo "\t\t<p>" . $formato_archivo_msg . "</p>\n";
 
			// Volver a Mostrar el Formulario
				echo $formulario;
			}
		}
?>

Espero tus comentarios u opiniones. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 29/07/2015 10:33:53
Muy bien! ^.^
Me he tomado el lujo de editar un poco tu código. Sientete libre de hacer con el lo que quieras.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
 
//Solo para uso de depuración
var_dump(isset($_FILES['archivo']));
echo PHP_EOL;
var_dump($_FILES['archivo']);
 
$formulario =
 
"<form action='$_SERVER[PHP_SELF]' method='post' enctype='multipart/form-data'>

\t<fieldset>

\t\t<legend>Subir Archivos</legend>

\t\t<label for='archivo'>Seleccione un Archivo</label>

\t\t<input type='file' name='archivo' size='30' />

\t\t<input type='hidden' name='operacion' value='accion' />

\t\t<input type='submit' name='submit' value='Subir Archivo' />

\t</fieldset>

\t</form>\n";
$formatos_validos=array(
    'image/jpg',
    'image/jpeg',
    'image/png',
    'image/gif',
    'application/pdf',
    'text/plain'
);
 
if(isset($_POST['operacion']) && $_POST['operacion']=="accion"){
 
    if(isset($_FILES['archivo'])){
        $nombre_archivo = $_FILES['archivo']['name'];
        $archivo_temporal = $_FILES['archivo']['tmp_name'];
        $errores_subida = $_FILES['archivo']['error'];
        $tamanyo_archivo = $_FILES['archivo']['size'];
        $formato_archivo = $_FILES['archivo']['type'];
 
        $directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
        $destino = $directorio . basename($nombre_archivo);
 
        if($errores_subida > 0){
            $errores_subida_msg = "Lo Siento! Ocurri&oacute; problemas al subir su Archivo!<br />\n".
            error2string($errores_subida);
            echo "\t\t<p>" . $errores_subida_msg . "</p>\n";
        }elseif($tamanyo_archivo >= 1000000){
            $tamanyo_archivo_msg = "Lo Siento! No se puede subir Archivo que pese m&aacute;s de 1MB!";
            echo "\t\t<p>" . $tamanyo_archivo_msg . "</p>\n";
        }elseif(!in_array($formato_archivo,$formatos_validos)){
            $formato_archivo_msg = "S&oacute;lo se permiten los formatos JPG, JPEG, PNG, GIF, PDF y TXT";
            echo "<p>" . $formato_archivo_msg . "</p>\n";
        }else{
            if(move_uploaded_file($archivo_temporal, $destino)){
                $mensaje = "Felicidades!! Su Archivo ha sido Subido Exitosamente!";
                echo "\t\t<p>" . $mensaje . "</p>\n";
                $msg_subir_archivo ="Subir Otro Archivo";
                echo "<center><a class='enlace' href='../../../laboratorio-php/upload-form/'
                title='Presionar para Subir M&aacute;s Archivos'>" . $msg_subir_archivo . "</a></center>\n";
            }else{
                $errores_subida_msg = "Lo Siento! Ocurri&oacute; problemas al subir su Archivo!<br />\n".
                "Error desconocido al mover el archivo.<br />\n".
                "Probablemente ya exista el archivo en el directorio de destino.";
                echo "<p>" . $errores_subida_msg . "</p>\n";
            }
        }
 
 
    }else{
        echo $formulario;
    }
 
}else{
    echo $formulario;
}
 
 
function error2string($code){
    switch ($code) {
        case UPLOAD_ERR_INI_SIZE:
        $message = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
        break;
        case UPLOAD_ERR_FORM_SIZE:
        $message = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
        break;
        case UPLOAD_ERR_PARTIAL:
        $message = "The uploaded file was only partially uploaded";
        break;
        case UPLOAD_ERR_NO_FILE:
        $message = "No file was uploaded";
        break;
        case UPLOAD_ERR_NO_TMP_DIR:
        $message = "Missing a temporary folder";
        break;
        case UPLOAD_ERR_CANT_WRITE:
        $message = "Failed to write file to disk";
        break;
        case UPLOAD_ERR_EXTENSION:
        $message = "File upload stopped by extension";
        break;
 
        default:
        $message = "Unknown upload error";
        break;
    }
    return $message;
}
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 30/07/2015 05:59:22
Pucha sos GALLO con la programación PHP, se le agradece, voy a respaldar mi código para probar el que usted escribió tomando en cuenta el mio para probarlo y hacer algunos cambios para hacer pruebas.

Gracias Totales :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 01/08/2015 17:39:18
Hola, estuve jugando con tu código y funciona de maravilla. Al menos con tu código ya estoy más claro acerca de cómo funciona el proceso a la hora de cargar un archivo al servidor, la importancia de la depuración y la funcionalidad de la función "error2string". Todo ésto gracias a tu código modificado en base a la mía.

Opté con dejarlo como estaba con mi código, agregando la validación de los formatos con el arreglo de las extensiones.

Aquí te muestro el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
	// Bloque del Formulario
	$formulario =
	"<form action='$_SERVER[PHP_SELF]' method='post' enctype='multipart/form-data'>
		\t<fieldset>
			\t\t<legend>Subir Archivos</legend>
			\t\t<label for='archivo'>Seleccione un Archivo</label>
			\t\t<input type='file' name='archivo' size='30' />
			\t\t<input type='hidden' name='operacion' value='accion' />
			\t\t<input type='submit' name='submit' value='Subir Archivo' />
		\t</fieldset>
	\t</form>\n";
 
	// Detallar los formatos o las extensiones del Archivo
	$formatos_validos = array('image/jpg', 'image/jpeg', 'image/png',
	'image/gif', 'application/pdf', 'text/plain');
 
	/* Si la accion de la operacion no es subir Archivo, 
		entonces mostrar el formulario. */
		if ($_POST['operacion'] != "accion") {
			echo $formulario; //Mostrar el Formulario
 
		/* Si la accion de la operacion es subir Archivo, 
		entonces revisar ciertas condiciones para subir Archivo. */
		} else if ($_POST['operacion'] == "accion") {
 
			// Especificar el Nombre del Archivo
			$nombre_archivo = $_FILES['archivo']['name'];
			/* Especificar el Archivo Temporal junto con su Nombre Temporal 
			antes de ser almacenado */
			$archivo_temporal = $_FILES['archivo']['tmp_name'];
			// Especificar los Errores de Carga o de la Subida del Archivo 
			$errores_subida = $_FILES['archivo']['error'];
			// Especificar el Tamaño del Archivo
			$tam_archivo = $_FILES['archivo']['size'];
			// Especificar el formato del Archivo
			$formato_archivo = $_FILES['archivo']['type'];
 
			// Especificar la Ruta del Directorio en dónde será almacenado
			$directorio = $_SERVER['DOCUMENT_ROOT']."/laboratorio-php/upload-form/files-uploaded/";
			// Especificar el Destino del Archivo cuando es almacenado 
			$destino = $directorio . basename($nombre_archivo);
 
			// Especificar el Mensaje cuando hay errores de carga del Archivo
			if (isset($_POST['submit']) && $errores_subida > 0) {
				$errores_subida_msg = "Lo Siento! Ocurri&oacute; problemas al subir su Archivo!";
				$subir_archivo = "no"; // Para Evitar subir Archivo
			}
 
			// Especificar el Mensaje cuando se pasa el Limite del Tamaño del Archivo
			if (isset($_POST['submit']) && $tam_archivo >= 1000000) {
				$tam_archivo_msg = "Lo Siento! No se puede subir Archivo que pese m&aacute;s de 1MB!";
				$subir_archivo = "no"; // Para Evitar subir Archivo
			}
 
			/* Especificar el Mensaje cuando No se permite subir Archivo con otras extensiones a excepción
			 de los siguientes formatos: JPG, JPEG, PNG, PDF y TXT */
			if (isset($_POST['submit']) && !in_array($formato_archivo,$formatos_validos)) {
				$formato_archivo_msg = "Lo Siento! S&oacute;lo se permite los formatos JPG, JPEG, PNG, PDF y TXT";
				$subir_archivo = "no"; //Para Evitar subir Archivo
			}
 
			// Especificar el Mensaje cuando se ha subido el Archivo
			if ($subir_archivo != "no" && isset($_POST['submit']) && in_array($formato_archivo,$formatos_validos)) {
				move_uploaded_file($archivo_temporal, $destino); // Subir el Archivo
				$mensaje = "Felicidades!! Su Archivo ha sido Subido Exitosamente!<br /><br />
				El formato o la Extensi&oacute;n de su Archivo es: " . $formato_archivo . ".";
				echo "\t<p class='mensaje'>" . $mensaje . "</p>\n";
 
			// Enlace para Subir Más Archivos
				$msg_subir_archivo ="Subir Otro Archivo";
				echo "<center><a class='enlace' href='../../../laboratorio-php/upload-form/'
				title='Presionar para Subir M&aacute;s Archivos'>" . $msg_subir_archivo . "</a></center>\n";
 
			// Especificar los Mensajes de Errores si NO se puede subir Archivos
			} else if ($subir_archivo == "no") {
				echo "\t<p>" . $errores_subida_msg . "</p>\n";
				echo "\t<p>" . $tam_archivo_msg . "</p>\n";
				echo "\t<p>" . $formato_archivo_msg . "</p>\n";
 
			// Volver a Mostrar el Formulario
				echo $formulario;
			}
		}
?>

Espero que hayas notado los cambios sólo acerca de la validación de las extensiones o formatos.

Aquí te muestro el formulario en vivo para subir archivos a mi servidor virtual: http://murillo.homelinux.net:8282/laboratorio-php/upload-form/.

Espero que te guste y espero tus opiniones. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 02/08/2015 03:20:49
Mi opinión es que no dejes abierta la puerta a que gente extraña pueda hackearte el servidor.

Como habrás podido observar en tu carpeta de archivos subidos te he dejado un PHP de prueba. En realidad podría haberte subido y reventado el servidor, me podria haber cargado Bases de datos que tuvieses por ahi y un sin fin de cosas.

Ten mucho cuidado con los hackers, lo usarán para meterte shellcodes o backdors para asegurarse el control de tu servidor.

Y no pongas estas cosas en un foro público si no tienes muy muy claro que no pueden entrar.

Yo soy buena persona y no te he puesto mas que un phpinfo() pero imagina el resto :P

PD: CIERRA CUANTO ANTES EL BOQUETE!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto Murillo

Problemas para subir Archivos al Servidor

Publicado por Roberto Murillo (10 intervenciones) el 02/08/2015 06:44:14
Ahí tenes toda la razón, gracias por el consejo. Ya vi el archivo PHP que subiste y con esto compruebo que estaba dejando vulnerable el servidor virtual ante cualquier ataque de los hackers.

Lo que acabo de hacer, es restringir la conexión de la url que te mostré en mi comentario anterior. Solo se podrá observar el formulario aquellos cuyas direcciones ip publicas y/o privadas están permitidas para acceder a esa url en especifico.

Si quieres, puedes volver a probar conectarte y veras que ya no puedes observar el formulario para subir archivos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto

Problemas para subir Archivos al Servidor

Publicado por Roberto (10 intervenciones) el 03/08/2015 08:04:38
Pregunta, cómo se cierra el boquete? No encuentro cómo se hace eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problemas para subir Archivos al Servidor

Publicado por unoMasDelMonton (32 intervenciones) el 04/08/2015 00:01:35
Así pensando rápido en el error que yo exploté la idea para mitigarlo sería comprobar la extensión del nombre del archivo a demás del tipo de archivo.

Probablemente tengas que seguir otros métodos más de securización para la subida de archivos. Yo no dejaría un formulario para subir archivos sin un pequeño login para personas en las que confíes o simplemente para ti mismo.
No le veo la utilidad de pedirle a gente random() que entre y suba archivos.
De hecho a malas, y sin tener ningún control de cantidad de conexiones por IP o algún control para evitar subir más de un numero determinado de archivos por IP o usuario yo no lo pondría a disposición del público.

Más que nada porque aun que le pongas un limite a los archivos (pongamos que de 3MB) un usuario mal intencionado podría crear un script para subir automáticamente archivos de 3MB y dejarlo corriendo durante varios días.
Hasta que te das cuenta te ha llenado la carpeta de basura.

Intenta imaginar vectores de ataque, conviértete en un atacante para poder aprender de tus errores al crear formularios en los que el usuario tiene la posibilidad de incluir datos de forma totalmente segura para ti.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Roberto

Problemas para subir Archivos al Servidor

Publicado por Roberto (10 intervenciones) el 04/08/2015 02:33:59
Si entiendo tu punto de vista, más bien, no me preocupo por el control de cantidad de conexiones por IP porque las IPs que tengo permitidos para esa url, son sólo IPs cuyos lugares sólo yo me ubico para conectarme, cualquier otra dirección ip de otras ubicaciones regionales o globales que se haya omitido, la conexión será denegada.

Aparte del controlar la restricción de conexión por IP, ya configuré un login de autenticación solamente para la url del formulario para subir archivos. Te doy la gracias por esa idea.

Estoy consciente que todo estas medidas de seguridad que acabo de configurar en el servidor virtual para el formulario, pueda que no sea lo suficientemente fuerte para prevenir un ataque cibernético. Es por esa razón que el servidor virtual está ubicada en una zona desmilitarizada DMZ detrás de un firewall para evitar que un hacker o varios hackers alcancen atacar en otras de mis redes locales de mayor importancia.

También estoy plenamente consciente que los hackers, de alguna forma u otra puedan atravesar el firewall a pesar que las políticas de seguridad del firewall están fuertemente configurados y todos los puertos a excepción del puerto 80, los tengo cerrados por la misma razón de seguridad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar