Red de conocimiento informático - Aprendizaje de programación - Problema de falla en la carga del archivo php

Problema de falla en la carga del archivo php

Al utilizar PHP para cargar archivos, necesita saber cómo controlar el tamaño del archivo cargado. El tamaño transferible del archivo se ve afectado por una variedad de factores, que se resumen a continuación:

1. php.ini:upload_max_filesize subir El tamaño máximo del archivo. El valor predeterminado es 2M.

2. php.ini:memory_limit Esta directiva establece el número máximo de bytes de memoria que el script puede solicitar. El valor predeterminado es 8M. Si no se requiere límite de memoria, se debe establecer en -1. Si no hay suficiente memoria, puede ocurrir un error: Error fatal: el tamaño de memoria permitido es . Esta configuración también afecta la carga de archivos. Si usa BLOB de MySQL para almacenar archivos binarios, debe configurar my.ini:max_allowed _packet=xxM

7, httpd.conf

Dentro de Apache, hay un límite de usuarios. para enviar Opciones HTTP para solicitar contenido LimitRequestBody. Esta opción se puede usar en .htaccess o httpd.conf, y si se usa en httpd.conf, se puede configurar en el atributo virtualhost o directorio respectivamente. La configuración de LimitRequestBody está entre 0 (sin límite) y 2147483647 (2 GB).

Por ejemplo, para establecer un límite de carga de 100 K en el directorio D:/AppServ/www, agregue la siguiente declaración en .htaccess o httpd.conf: LimitRequestBody (cuerpo de la solicitud): 0 (ilimitado) a 2147483647 (2 GB). conf:

LimitRequestBody 1024000000

Opciones Índices FollowSymLinks MultiViews ExecCGI

AllowOverride All

Ordenar permitir,

Todos permitir

LimitRequestBody 1024000000Opciones Índices FollowSymLinks MultiViews ExecCGIAllowOverride AllOrder permitir, denegarAllow de todos

Si configura esto a través de .htaccess, eliminará todas las solicitudes de .htaccess. htaccess, que entrará en vigor inmediatamente después de almacenar el archivo. Si se configura a través de httpd.conf, se debe reiniciar Apache.

La sección de PHP sobre carga de archivos menciona específicamente el campo oculto del formulario: MAX_FILE_SIZE, que es el tamaño máximo del archivo recibido.

La documentación proporciona el siguiente ejemplo:

Envíe este archivo:

form.gt;

Enviar este archivo:

Establecer MAX_FILE_SIZE = 30,000 Se espera que el navegador pueda pre -determinar antes de enviar el archivo El tamaño del archivo, si el tamaño del archivo es superior a 30.000 bytes, no se realizará la operación POST real. Es decir, el usuario no enviará el contenido del archivo al servidor, pero recibirá el mensaje "El archivo que está intentando cargar supera los 30000 bytes" directamente en el cliente.

Es una buena idea, pero en realidad no se puede realizar por el momento. Esto no quiere decir que la restricción se pueda "evitar fácilmente", sino que ni IE ni Firefox admiten esta restricción y la sugerencia de PHP aún no se ha adoptado.

MAX_FILE_SIZE tiene otro propósito: el back-end PHP determinará si el tamaño del archivo entrante es mayor que este valor. Si es mayor, $_FILES['thisfile']['error'] lo hará. debe configurarse en UPLOAD_ERR_FORM_SIZE (2), mientras deja de guardar archivos temporales, configure $_FILES['thisfile']['size']

Este ejemplo no tiene problemas y se comporta normalmente cuando intento cargar un. archivo de más de 40K, los programas PHP informarán "El archivo excede MAX_FILE_SIZE".

¿Pero qué pasa si bajamos el MAX_FILE_SIZE en el formulario de 30000 a 1000?

Es normal cargar un archivo de 800 bytes.

Cuando carga un archivo de 40 K, PHP informará que el archivo es demasiado grande, lo cual es normal.

Cargue un archivo de 3000 bytes, PHP no informará ningún error y el archivo se guardará correctamente. ¡Inesperado!

El problema radica en la parte del código en main/rfc1867.c que determina si el archivo es demasiado largo. PHP leerá FILLUNIT bytes del búfer cada vez y luego primero determinará si la "longitud del contenido leído (total_bytes)" es mayor que MAX_FILE_BYTES y mayor que MAX_FILE_SIZE, y luego aumentará la longitud del contenido leído (total_bytes). De esta manera, habrá como máximo un error de byte FILLUNIT entre el resultado esperado y FILLUNIT=1024*5=5K. (Haga clic en el error para obtener más información)

Esto significa que cuando MAX_FILE_SIZE<5K, no habrá problemas para cargar archivos mayores que MAX_FILE_SIZE pero menores que 5K.

Por supuesto, la programación del lado del servidor no debe depender de MAX_FILE_SIZE ya que esta configuración se puede omitir fácilmente. Además, 5K termina siendo un valor pequeño que no tiene impacto en la mayoría de los formularios que cargan archivos.

Las configuraciones post_max_size, upload_max_filesize y MAX_FILE_SIZE en PHP no tienen nada que ver con el tamaño del tráfico de carga desde el cliente al servidor.

El servidor Apache recibe la solicitud del cliente hasta que el número del cuerpo de la solicitud es limitado, y luego la pasa al módulo php, que decide si guardarla como un archivo temporal, establece la variable global $_FILES y déjelo en manos del script para su posterior procesamiento.

La opción LimitRequestBody de Apache tiene como valor predeterminado 0 y el tamaño máximo permitido del cuerpo de la solicitud es 2G bytes (Linux + Apache)

Finalmente, también debes tener en cuenta:

La cantidad de datos publicados en html es limitada y no puede exceder 2G.

El puntero de desplazamiento de archivos del cliente FTP tiene un límite de 2 GB, y el servidor ftp o el compilador del cliente que no está compilado con indicadores de compilación especiales no admite archivos que superen los 2 GB, independientemente del FS en el que se encuentren. . No sé si ocurre lo mismo con PHP.