web-dev-qa-db-fra.com

Le téléchargement HTML MAX_FILE_SIZE ne semble pas fonctionner

Je me demande comment est le champ caché nommé MAX_FILE_SIZE censé travailler?

<form action="" method="post" enctype="multipart/form-data">
    <!-- in byes must preceed file field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
    <input type="file" name="upload" />

    <input type="submit" name="submit" value="Submit" />
</form>

J'ai téléchargé un fichier de 4 Mo + mais je n'ai reçu aucun avertissement du côté client (je ne parle pas du côté serveur). Qu'Est-ce que c'est MAX_FILE_SIZE censé faire?

MISE À JOUR

OK donc c'est pour PHP pour imposer une limite "douce". Mais y a-t-il une différence entre l'utiliser et vérifier quelque chose comme $_FILES['upload']['size'] < 2000 dans du code?

36
JM at Work

MAX_FILE_SIZE Est dans KB pas octets. Vous aviez raison, c'est en octets. Donc, pour une limite de 4 Mo convert 4MB in bytes {1024 * (1024 * 4)} essayez:

<input type="hidden" name="MAX_FILE_SIZE" value="4194304" /> 

enter image description here

Mise à jour 1

Comme expliqué par d'autres, vous n'aurez jamais d'avertissement à ce sujet. Il est là juste pour imposer une limite douce côté serveur.

Update 2

Pour répondre à votre sous-question. Oui, il y a une différence, vous ne faites JAMAIS confiance à l'entrée utilisateur. Si vous voulez toujours imposer une limite, vous devez toujours vérifier sa taille. Ne faites pas confiance à ce que fait MAX_FILE_SIZE, Car il peut être modifié par un utilisateur. Donc, oui, vous devez vous assurer qu'il est toujours au niveau ou au-dessus de la taille que vous souhaitez qu'il soit.

La différence est que si vous avez imposé un MAX_FILE_SIZE De 2 Mo et que l'utilisateur essaie de télécharger un fichier de 4 Mo, une fois qu'ils atteignent environ les 2 premiers Mo de téléchargement, le transfert se termine et le PHP n'acceptera plus de données pour ce fichier. Il signalera l'erreur sur le tableau de fichiers.

43
Shef

Avant de commencer, permettez-moi de souligner que la taille du fichier doit être vérifiée côté serveur . S'ils ne sont pas cochés côté serveur, les utilisateurs malveillants peuvent outrepasser vos limites côté client et télécharger d'énormes fichiers sur votre serveur. NE FAITES PAS CONFIANCE AUX UTILISATEURS.

J'ai un peu joué avec MAX_FILE_SIZE de PHP, cela ne semblait fonctionner qu'après le téléchargement du fichier, ce qui le rend non pertinent (encore une fois, un utilisateur malveillant peut le remplacer assez facilement).

Le code javascript ci-dessous (testé dans Firefox et Chrome), basé sur le post de Matthew , avertira l'utilisateur (le bon, l'innocent) a priori de télécharger un gros fichier, économisant à la fois du trafic et du temps de l'utilisateur :

<form method="post" enctype="multipart/form-data" 
onsubmit="return checkSize(2097152)">    
<input type="file" id="upload" />
<input type="submit" />
<script type="text/javascript">
function checkSize(max_img_size)
{
    var input = document.getElementById("upload");
    // check for browser support (may need to be modified)
    if(input.files && input.files.length == 1)
    {           
        if (input.files[0].size > max_img_size) 
        {
            alert("The file must be less than " + (max_img_size/1024/1024) + "MB");
            return false;
        }
    }

    return true;
}
</script>
40
Roei Bahumi

Pour tous ceux qui s'étaient émerveillés que certains fichiers soient facilement téléchargés et d'autres non, cela pourrait être un problème de taille. Je partage cela car j'étais coincé avec mon PHP ne téléchargeant pas de gros fichiers et je continuais à supposer qu'il ne téléchargeait aucun fichier Excel. Donc, si vous utilisez PHP et vous souhaitez augmenter la limite de téléchargement de fichiers, accédez au fichier php.ini et apportez les modifications suivantes:

  • upload_max_filesize = 2M

être changé en

  • upload_max_filesize = 10M

  • post_max_size = 10M

ou la taille requise. Redémarrez ensuite le serveur Apache et le téléchargement commencera comme par magie. J'espère que cela sera utile à quelqu'un.

7
Nandakishore

En fait, cela ne fonctionne pas vraiment. Vous pouvez trouver une explication dans l'un des commentaires de la page de manuel: http://www.php.net/manual/en/features.file-upload.php#74692

Réponse à la question mise à jour: la différence évidente est que les vérifications côté serveur sont fiables, les vérifications côté client ne le sont pas.

4
Álvaro González

Explication PHP.net sur le champ caché MAX_FILE_SIZE.

Le champ caché MAX_FILE_SIZE (mesuré en octets) doit précéder le champ d'entrée du fichier, et sa valeur est la taille de fichier maximale acceptée par PHP. Cet élément de formulaire doit toujours être utilisé car il évite aux utilisateurs d'avoir à attendre qu'un gros fichier soit transféré pour constater qu'il était trop volumineux et que le transfert a échoué. Gardez à l'esprit: tromper ce paramètre du côté du navigateur est assez facile, alors ne vous fiez jamais à des fichiers de plus grande taille bloqués par cette fonctionnalité. Il s'agit simplement d'une fonctionnalité pratique pour les utilisateurs du côté client de l'application. Cependant, les paramètres PHP (côté serveur) pour la taille maximale ne peuvent pas être trompés.

http://php.net/manual/en/features.file-upload.post-method.php

3
SandroMarques

Il est uniquement censé envoyer les informations au serveur. La raison pour laquelle il doit précéder le champ de fichier est qu'il doit précéder la charge utile du fichier dans la demande pour que le serveur puisse l'utiliser pour vérifier la taille du téléchargement.

La façon dont la valeur est utilisée sur le serveur dépend de ce que vous utilisez pour prendre en charge le téléchargement. Le code est censé être destiné à un composant de téléchargement spécifique qui recherche spécifiquement cette valeur.

Il semble que le support de téléchargement intégré in PHP est celui qui utilise cette valeur de champ.

3
Guffa

Il y a IS UN POINT pour introduire MAX_FILE_SIZE champ de formulaire caché côté client.

php.ini peut limiter la taille du fichier téléchargé. Ainsi, alors que votre script respecte la limite imposée par php.ini, différents formulaires HTML peuvent limiter davantage la taille d'un fichier téléchargé. Ainsi, lors du téléchargement de vidéos, le formulaire peut limiter * la taille maximale à 10 Mo, et lors du téléchargement de photos, les formulaires peuvent mettre une limite de seulement 1 Mo. Et en même temps, la limite maximale peut être définie dans php.ini pour supposer 10 Mo pour permettre tout cela.

Bien que ce ne soit pas un moyen infaillible de dire au serveur quoi faire, il peut néanmoins être utile.

  • Le HTML ne limite rien. Il transmet simplement au serveur toutes les variables de formulaire, y compris MAX_FILE_SIZE et sa valeur.

J'espère que cela a aidé quelqu'un.

1
Hamid Sarfraz