394 Shares 5022 views

PHP: carga de archivos al servidor

La descarga de archivos a través de PHP – un caso muy interesante, a la que debe ser abordado con mucho cuidado. En Internet se pueden encontrar numerosos ejemplos de la aplicación de la carga de archivos, pero no todos ellos son buenos y cumplir con las normas de seguridad.

Tales cosas tienen que llevar a término, incluso si se lleva mucho tiempo. Si deja un vacío en el código, a continuación, todo el servidor puede verse comprometida.

seguridad

Con PHP de carga de archivos al servidor se lleva a cabo con bastante facilidad. El código es muy corto y simple. Sólo un par de líneas. Sin embargo, este método es peligroso. Mucho más tiempo y líneas de código a un lugar seguro.

El peligro es que, si usted no hace inspecciones, cualquier atacante podría subir sus scripts en su servidor. En este caso, tendrá acceso completo. Él puede hacer lo que quiera:

  • eliminar la base de datos;
  • eliminar sitios archivos;
  • modificar los sitios de archivos;
  • añadir su anuncio a su sitio web;
  • descargar virus;
  • redirigir todos los usuarios en sus sitios;
  • y muchas otras cosas que vienen a la mente atacante.

Siempre debe comprobar que intenta descargar un archivo para el usuario. Por ejemplo, si carga sólo imágenes, es necesario verificar que el archivo es una imagen con precisión. De lo contrario, descargar nada.

Exactamente cómo implementar la verificación, se mostrará, con el guión examen directo para subir archivos.

Crear un formulario PHP

formulario de carga de archivos es muy sencillo. Faltan los botones botón buscar y cargar.

Describe cómo crear formas no lo hará, porque es fácil. Otras instrucciones se supone que ya tiene los conceptos básicos de HTML (de lo contrario no estarían buscando información sobre la descarga de PHP).

Pero tenga en cuenta que los datos en el formulario que necesita añadir el atributo enctype.

De lo contrario, no se transmitirán datos sobre manejador de archivo.

Cómo debería funcionar?

Al hacer clic en el botón de exploración debería ver una caja donde le pide que elija un archivo.

Después de que se requiere para recibir una ruta donde se encuentra el archivo.

Si no aparece la ruta de acceso, realizar la acción de nuevo.

Después de hacer clic en el controlador de descarga de archivos puede dar ninguna información.

Por ejemplo, se puede escribir la línea que indica que el archivo es "tal y tal", el nombre se ha cargado correctamente en la carpeta "tal y tal". Por supuesto, el nombre del archivo se dará siempre diferente.

Normalmente, esta información se utiliza para depurar el código. De esta manera es posible verificar que los datos se transmiten y escrituras se producen en el directorio deseado. Es decir, incluso el nombre del archivo no está indicado. Dado que esta información adicional que el usuario no necesita.

Tiene sentido de salida el nombre sólo si el usuario descarga varios archivos. Tal es el caso, considere un poco más lejos. No vamos a salir adelante de nosotros mismos.

ajuste

En PHP carga de archivos al servidor requiere ciertos ajustes, los cuales deben realizarse en el archivo php.ini. Este archivo contiene una gran cantidad de configuraciones. Que todo lo que no necesitamos. Estamos interesados en tres líneas: file_uploads, upload_tmp_dir y upload_max_filesize.

Tenga en cuenta que estos ajustes afectarán a todos sus sitios en el servidor, no sólo cualquiera. Por lo tanto, para establecer el tamaño máximo basado en el hecho de que va a tener que cargar a los usuarios. No se recomienda ajustar demasiado grande.

Una vez que cambie los valores de estos parámetros, es necesario reiniciar el servidor. De lo contrario, los ajustes no tendrán efecto, a medida que leen en el momento de la carga del servidor.

Puede hacer esto en la consola mediante la conexión a través de SSH al servidor. Basta con introducir el comando service httpd restart, y luego los ajustes serán efectivos.

Otro método – un reinicio a través del ISP-panel o proveedor a través del panel de facturación.

archivo de matriz

En PHP para subir archivos se realiza mediante la matriz $ _FILES. Contiene toda la información sobre los archivos que descargamos.

Para ver la información que está contenida en la matriz, lo suficiente como para escribir en el controlador de archivo siguientes.

Seleccionar cualquier archivo y haga clic en "Subir". En la página controlador mostrará la información que se almacena en $ _FILES. La variable está escrito completamente en mayúsculas. PHP – un lenguaje sensible.

Como se puede ver, en esta matriz tiene una gran cantidad de campos. Todos ellos son importantes para nosotros. El primer campo contiene el nombre del archivo en la forma en la que se utiliza en el equipo.

La columna de tipo especifica el tipo de archivo. Tmp_name campo corresponde al nombre del archivo temporal. Tras el final de la secuencia de comandos se eliminarán.

El campo de error contiene un código de error. Este fue un poco más lejos. Tamaño – el tamaño en bytes.

errores

Llevado a cabo a través de la carga de archivos PHP siempre va acompañado de un código de error. Un mensaje de error introducido en el "error". El error de pantalla es cero.

Considere el valor de todos los errores:

Se ha dicho anteriormente acerca del parámetro que se puede especificar en el código HTML de costumbre.

Aquí hay un ejemplo de formulario para descargar el archivo, lo que indica un límite de la cantidad del archivo cargado.

script de carga de archivos: PHP

Como todos ellos llevados a cabo en la práctica? En PHP archivo de carga se produce comando de copia. Si usted está interesado en la cuestión de cómo descargar un archivo, la respuesta es sencilla contra copias, que utiliza dos parámetros – el archivo de origen y el archivo de destino.

Pero, como se ha dicho, no puede ser limitada por razones de seguridad. Por ejemplo, echa un vistazo a qué tipo de archivo que enviamos, puede utilizar el tipo de campo en el array $ _FILES. En primer lugar, vamos a tratar con la inspección, y luego pasar a la secuencia de comandos completa

Digamos que usted desea permitir a los usuarios subir una foto con una resolución de sólo el GIF, JPEG o PNG. Indican que puede ser así.

if ($ _ FILES [ 'file_upload'] [ 'type']! = "image / gif") {
echo "Lo siento, solo se soportan la descarga de archivos Gif-";
salida;
}

Si usted quiere enviar los 3 tipos, basta con añadir una condición adicional a otro tipo de imagen.

La copia se realiza así: copia (Imagen 1, Imagen 2).

En nuestro caso, cuando el trabajo se está descargando desde el PC al servidor, puede hacerlo

copia ($ _ FILES [ 'file_upload'] [ "tmp_name"], "1.jpg")

Es decir, el archivo se copiará con el nombre 1.jpg. Esto no es del todo correcto. En este caso, es sólo un ejemplo. El nombre del archivo es siempre necesario especificar diferentes, y especificar la extensión, dependiendo del archivo.

Determinar la extensión puede ser de diferentes maneras. Todo depende de los desarrolladores de erudición. Una de las maneras más rápidas para (a diferencia de décimas de segundo) determinar la extensión – Este es el siguiente código.

$ Path_Info = pathinfo ($ _ FILES [ 'photo1'] [ "name"]);

$ Ext = $ PATH_INFO [ 'extensión'];

La variable $ ext la que almacenará la extensión deseada. Un nombre de archivo se puede ajustar de forma aleatoria usando MD5. Si va a descargar una gran cantidad de archivos, es mejor enviarlos a diferentes carpetas. Por lo que será más conveniente. En particular, si desea purgar.

para descargar el código será el siguiente.

/// Con foto

if ($ _FILES [ 'photo1'] [ 'tmp_name'] == null)

{

echo ( "

archivo desconocido.

Volver …

");

salida;

}

///. Usted dice que para cualquier proyecto en el servidor se le permite cargar archivos de gran tamaño (vídeo), pero no son sólo las imágenes, y los usuarios tienen que limitar

if (($ _FILES [ "foto1"] [ "tamaño"]> 1024 * 1024 * 2)

{

?>

el tamaño máximo permitido de 2 MB

Volver …

<?

salida;

}

// crear carpetas

// crear una carpeta del mes en curso

if (! file_exists ( "img /". fecha ( "M")))

{

mkdir ( "img /" fecha ( "M").);

}

// crear una carpeta del día actual

if (! file_exists ( "img /". fecha ( "M"). "/". fecha ( "D")))

{

mkdir ( "img /" fecha ( "M") "/" fecha ( "D") …);

}

/// extensión de archivo

$ Path_Info = pathinfo ($ _ FILES [ 'photo1'] [ "name"]);

$ Ext = $ PATH_INFO [ 'extensión'];

/// generar el nombre de archivo

$ Id = MD5 (fecha ( "AMD"));

si (copia ($ _ FILES [ 'photo1'] [ "tmp_name"], "img /". fecha ( "M"). "/". fecha ( "D"). "/". $ id. $ ext) )

{

echo ( "archivo cargado con éxito");

}

/// cualquier acción adicional (entrada en la base de datos, y así sucesivamente. N.)

}

varios archivos

Carga de varios archivos (PHP) se produce por medio de campos adicionales en la forma.

Este método no es muy bueno, ya que limita el número de archivos para descargar. Por otra parte, se considera de mala educación en la programación. Tratar de hacer todo dinámico.

La opción ideal – es una elección de un gran número de archivos a la vez pulsando un solo botón.

Para ello, cree una forma como este código.

Tenga en cuenta que la adición múltiple de la palabra, y el nombre se da como una matriz []. En este caso, array $ _FILES será un poco diferente. Obtendrá un conjunto de la matriz.

Para probar de nuevo puede utilizar la var_dump ($ _ FILES);

Todos los archivos se colocan en la matriz de la siguiente manera:

  1. $ _FILES [ "archivo1"] [ "nombre"] [0]
  2. $ _FILES [ "archivo1"] [ "nombre"] [1]
  3. Y así sucesivamente.

Entre paréntesis se escribe el número de archivo de la matriz. A contar desde cero. Los tratamos de la misma manera, sólo pide el ciclo y poniéndose en contacto con el código anteriormente descrito al final del índice añadiendo [$ i].

$ I = 0;

while ($ _FILES [ "archivo1"] [ "nombre"] [$ i] '')

{

/// pegar el código anterior

}

Por lo tanto, tendrá que pasar por una carga de archivos PHP con el servidor en un ciclo sin repetición innecesaria del código, como suele ser el caso si se utiliza la versión con un número estático de archivos (última foto).