subir - upload file php 7
MAX_FILE_SIZE en PHP, ¿cuál es el punto? (6)
Estaba intentando hacer un formulario de carga de archivos y revisé la documentación de PHP para actualizar mi memoria sobre el tema. Aquí hay un enlace al artículo relevante. De repente me di cuenta de este mensaje:
El campo oculto MAX_FILE_SIZE (medido en bytes) debe preceder al campo de entrada del archivo, y su valor es el tamaño máximo de archivo aceptado por PHP. Este elemento de formulario siempre debe usarse, ya que les ahorra a los usuarios la molestia de esperar a que se transfiera un archivo grande solo para encontrar que era demasiado grande y que la transferencia falló. Tenga en cuenta: engañar esta configuración en el lado del navegador es bastante fácil, así que nunca confíe en que los archivos de mayor tamaño estén bloqueados por esta función. Es simplemente una característica de conveniencia para los usuarios en el lado del cliente de la aplicación. La configuración de PHP (en el lado del servidor) para el tamaño máximo, sin embargo, no puede ser engañada.
Ok ... dime que? Primero le dice que debe preceder el campo de carga de archivos. Entonces nos dice que es meramente por conveniencia. Y además, está del lado del cliente de todos modos, así que cualquiera puede meterse con eso. Después de buscar en Google, también encontré información de que no hay navegadores conocidos que lo admitan.
WTF? ¿Por qué se dice que debe preceder al campo de carga de archivos si parece ser (para todos los efectos) absolutamente inútil? ¿Debo molestarme en ponerlo en mi HTML?
Creo que el punto es que los navegadores conformes evitarían el envío de formularios en el caso de que el usuario seleccionara un archivo que fuera demasiado grande, lo que evitaría que tuviera que realizar al menos una carga parcial (lo que podría llevar un tiempo) de un archivo que estaba va a ser rechazado
En el lado del servidor, PHP aún verifica y aplica los diversos límites establecidos en PHP.ini, y hará referencia al hecho de que una carga fue demasiado grande de la manera normal, es decir, un código de error establecido en $ _FILES. Puede pensar en el campo como una analogía con la validación de JavaScript: podríamos hacer una rápida comprobación del lado del cliente para la conveniencia del usuario, pero aún así hacemos una prueba adecuada del lado del servidor y la hacemos cumplir para todas las solicitudes.
Como han dicho otros, no parece haber ningún navegador que realmente se moleste en realizar esta comprobación, por lo que es relativamente inútil.
Después de un intento fallido de encontrar información autorizada sobre MAX_FILE_INFO, decidí recurrir a medidas drásticas, y eché un vistazo a la fuente sagrada de PHP.
Escaneé toda la fuente PHP recursivamente usando grep:
grep -ri MAX_FILE_SIZE .
El único lugar que mencionó esta variable fue (excluyendo la carpeta de pruebas) - archivo rfc1867.c. Completamente esperado, ya que el estándar rfc1867 se ocupa de la carga de archivos.
Código C relacionado:
......
if (!strcasecmp(param, "MAX_FILE_SIZE")) {
max_file_size = atol(value);
}
......
......
if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) {
cancel_upload = UPLOAD_ERROR_A;
} else if (max_file_size && ((total_bytes+blen) > max_file_size)) {
cancel_upload = UPLOAD_ERROR_B;
} else if
....
Entonces, aquí hay una breve explicación del código anterior:
1) primero obtenemos el valor de MAX_FILE_SIZE en la variable max_file_size.
2) Luego verificamos si el valor de max_file_size existe y si la suma de bytes ya aceptados (total_bytes) + el tamaño de los bytes en el búfer (blen) excede max_file_size.
3) Si 2 es verdadero, en este punto cancelamos la carga con un código de error que se estableció con esta constante: UPLOAD_ERROR_B
PERO, como puede ver, justo antes de verificar la variable max_file_size, ¡PHP realiza EXACTAMENTE EL MISMO CHECK para la variable upload_max_filesize! Así que ahí lo tenemos.
Conclusión: En mi humilde opinión, op está bien, ¡hay 0 puntos en incluir MAX_FILE_SIZE en sus formularios! Simplemente configure upload_max_filesize en su archivo php.ini o dinámicamente a través de ini_set ().
En este momento no hay navegadores que realmente se preocupen por la directiva MAX_FILE_SIZE, por lo que es bastante inútil. Supongo que le da un control más granular sobre los tamaños máximos en la carga (como se indica en el póster anterior) en lugar de ir con php.ini, pero personalmente simplemente lo ignoro, y probablemente debería hacerlo también. Desde luego, no impedirá que un usuario cargue un archivo más grande que el requerido; el manual es bastante engañoso a este respecto.
Hasta que no encontremos navegadores compatibles, no tiene sentido en el lado del cliente .
Sin embargo, en el lado del servidor , MAX_FILE_SIZE
afecta los valores que obtiene de $_FILES[''your_file'']
.
Asumiendo que la solicitud del navegador realmente lo hizo a través de post_max_size
, generalmente esto es lo que PHP da:
array(5) {
["name"]=> string(11) "my_upload.dll"
["type"]=> string(24) "application/x-msdownload"
["tmp_name"]=> string(26) "C:/WINDOWS/Temp/php86A.tmp"
["error"]=> int(0) // UPLOAD_ERR_OK
["size"]=> int(238592)
}
Pero si el tamaño del archivo cargado excede MAX_FILE_SIZE
, MAX_FILE_SIZE
:
array(5) {
["name"]=> string(11) "my_upload.dll"
["type"]=> string(0) ""
["tmp_name"]=> string(0) ""
["error"]=> int(2) // UPLOAD_ERR_FORM_SIZE
["size"]=> int(0)
}
Y la parte en " MAX_FILE_SIZE
debe preceder al campo de entrada del archivo" no es una broma. Realmente funciona porque PHP interpretará la carga útil de la solicitud POST
del navegador de forma secuencial:
<input name=F1 type=file>
<input name=F2 type=file>
F1 and F2 will not be affected by MAX_FILE_SIZE
<input name=MAX_FILE_SIZE value=1024 type=hidden>
<input name=F3 type=file>
<input name=F4 type=file>
F3 and F4 will have MAX_FILE_SIZE = 1024 bytes
<input name=MAX_FILE_SIZE value=0 type=hidden>
<input name=F5 type=file>
<input name=F6 type=file>
F5 and F6 will have MAX_FILE_SIZE = 0 (infinite)
<input name=MAX_FILE_SIZE value=1 type=hidden>
<input name=F7 type=file>
<input name=F8 type=file>
F7 and F8 will have MAX_FILE_SIZE = 1 byte
También tenga en cuenta que PHP interpreta MAX_FILE_SIZE
mayúsculas insensiblemente, por lo que maX_fILe_sIZE
y Max_File_SIZE
también funcionarán.
Lo uso para establecer el límite de tamaño de archivo cuando una aplicación en particular necesita archivos más pequeños que el límite en php.ini
. Mis scripts php lo comprueban, pero está configurado en el formulario HTML. Diferentes formularios tienen diferentes límites de tamaño de archivo. No estoy seguro de si esto tiene mucho que ver con el uso previsto, pero facilita la reutilización de mis scripts. Sería bueno si pudiera verificarse en el nivel del navegador, pero no es la única razón por la que es útil.
Lo que sigue es que estoy equivocado, lea las otras respuestas que están mejor informadas y son precisas (AFAIK).
Creo que el punto es exactamente como dice:
Este elemento de formulario siempre debe usarse, ya que ahorra a los usuarios la molestia de esperar a que se transfiera un archivo grande solo para encontrar que era demasiado grande y que la transferencia falló
Sí, se puede engañar y, por lo tanto, no se debe confiar en él para evitar que se carguen archivos más grandes, pero para usuarios no malintencionados si el archivo cargado es más grande que el número entero en este campo, PHP no permite esta carga y presenta un error. código en la matriz $_FILES
(fuente - comentarios en php.net ).