Comment créer un type d'entrée = fichier Ne doit accepter que les formats PDF et XL

96

j'ai utilisé <input type= "file" name="Upload" >

Maintenant, je voudrais limiter cela en acceptant uniquement les fichiers .pdf et .xls.

Lorsque je clique sur le bouton Soumettre, cela doit valider.

Et lorsque je clique sur les fichiers (PDF / XLS) sur la page Web, ils devraient s'ouvrir automatiquement.

Quelqu'un pourrait-il donner quelques exemples à ce sujet?

Manikandan
la source

Réponses:

174

Vous pouvez le faire en utilisant l'attribut accept et en y ajoutant des types mime autorisés. Mais tous les navigateurs ne respectent pas cet attribut et il pourrait facilement être supprimé via un inspecteur de code. Dans les deux cas, vous devez vérifier le type de fichier côté serveur (votre deuxième question).

Exemple:

<input type="file" name="upload" accept="application/pdf,application/vnd.ms-excel" />

À votre troisième question "Et quand je clique sur les fichiers (PDF / XLS) sur la page Web, ils devraient s'ouvrir automatiquement.":

Vous ne pouvez pas y parvenir. La manière dont un PDF ou XLS est ouvert sur la machine client est définie par l'utilisateur.

Feeela
la source
Salut feeela Lorsque je télécharge les fichiers, ils seront stockés sur le serveur. J'ai entendu dire qu'il est possible par les fonctions javascript d'ouvrir des fichiers .pdf et .xls en cliquant sur les fichiers sur navigateur ...
Manikandan
c'est tout ! Les deux côtés client et serveur expliqués.
2
si vous répertoriez tous les fichiers dans la zone de sélection. vous pouvez toujours télécharger n'importe quel fichier.
rüff0
55

vous pouvez utiliser ceci:

HTML

<input name="userfile" type="file" accept="application/pdf, application/vnd.ms-excel" />

support uniquement. PDF et. Fichiers XLS

Radames E. Hernandez
la source
14

Malheureusement, il n'y a pas de moyen garanti de le faire au moment de la sélection.

Certains navigateurs prennent en charge l' acceptattribut pour les inputbalises. C'est un bon début, mais on ne peut pas s'y fier complètement.

<input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />

Vous pouvez utiliser a cfinputet exécuter une validation pour vérifier l' extension de fichier lors de la soumission, mais pas le type mime. C'est mieux, mais toujours pas infaillible. Les fichiers sur OSX n'ont souvent aucune extension de fichier ou les utilisateurs peuvent malicieusement étiqueter les types de fichiers.

ColdFusion cffilepeut vérifier le type mime en utilisant la contentTypepropriété du résultat ( cffile.contentType), mais cela ne peut être fait qu'après le téléchargement. C'est votre meilleur pari, mais ce n'est toujours pas sûr à 100% car les types mime peuvent toujours être erronés.

Joe C
la source
3
S'il vous plaît, ne vérifiez jamais un fichier basé sur l'extension. Qu'en est-il d'un exécutable nommé lolcat.jpg?
feeela
1
Je pense que ce que phantom42 essaie de dire ici, c'est que vous devriez vérifier l'extension et le type MIME sur le serveur. L' acceptattribut sur la inputbalise peut être ajouté mais n'est pas efficace à 100%.
Chris Peters
Je suis 100% d'accord. Il ne peut pas être invoqué, mais je le trouve OK en tant que première ligne de défense en conjonction avec le cffile.contenttype.
Joe C
Salut Phantom Comme vous l'avez dit, cette acceptation ne fonctionne que dans Chrome et non dans IE. Existe-t-il un autre moyen de le faire qui sera pris en charge par tous les navigateurs
Manikandan
Malheureusement non; c'est pourquoi j'ai dit qu'il ne pouvait pas être invoqué et qu'il devait être utilisé en conjonction avec les autres méthodes si vous l'utilisez du tout.
Joe C
3

Vous pouvez utiliser JavaScript. Tenez compte du fait que le gros problème avec JavaScript est de réinitialiser le fichier d'entrée. Eh bien, cela se limite uniquement au JPG (pour PDF, vous devrez changer le type de mime et le nombre magique ):

<form id="form-id">
  <input type="file" id="input-id" accept="image/jpeg"/>
</form>

<script type="text/javascript">
    $(function(){
        $("#input-id").on('change', function(event) {
            var file = event.target.files[0];
            if(file.size>=2*1024*1024) {
                alert("JPG images of maximum 2MB");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            if(!file.type.match('image/jp.*')) {
                alert("only JPG images");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            var fileReader = new FileReader();
            fileReader.onload = function(e) {
                var int32View = new Uint8Array(e.target.result);
                //verify the magic number
                // for JPG is 0xFF 0xD8 0xFF 0xE0 (see https://en.wikipedia.org/wiki/List_of_file_signatures)
                if(int32View.length>4 && int32View[0]==0xFF && int32View[1]==0xD8 && int32View[2]==0xFF && int32View[3]==0xE0) {
                    alert("ok!");
                } else {
                    alert("only valid JPG images");
                    $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                    return;
                }
            };
            fileReader.readAsArrayBuffer(file);
        });
    });
</script>

Tenez compte du fait que cela a été testé sur les dernières versions de Firefox et Chrome, et sur IExplore 10.

Pour une liste complète des types de mime, consultez Wikipedia .

Pour une liste complète des nombres magiques, consultez Wikipedia .

lmiguelmh
la source
2

Je filtrerais les fichiers côté serveur, car il existe des outils, comme les Live HTTP Headers sur Firefox, qui permettraient de télécharger n'importe quel fichier, y compris un shell. Les gens pourraient pirater votre site. Faites-le site serveur, pour être sûr.

Alexandre Hitchcox
la source
C'est tout à fait vrai! Veuillez ne pas ignorer ce conseil
Rodney Salcedo
1

Bien que cet exemple particulier concerne un téléchargement de fichiers multiples, il donne les informations générales dont on a besoin:

https://developer.mozilla.org/en-US/docs/DOM/File.type

Pour ce qui est d'agir sur un fichier sur / download / ce n'est pas une question Javascript - mais plutôt une configuration de serveur. Si un utilisateur n'a pas installé quelque chose pour ouvrir les fichiers PDF ou XLS, son seul choix sera de les télécharger.

Jeremy J Starcher
la source
0

Si vous souhaitez que le contrôle de téléchargement de fichiers limite les types de fichiers que l'utilisateur peut télécharger en cliquant sur un bouton, c'est la manière.

<script type="text/JavaScript">
<!-- Begin
function TestFileType( fileName, fileTypes ) {
if (!fileName) return;

dots = fileName.split(".")
//get the part AFTER the LAST period.
fileType = "." + dots[dots.length-1];

return (fileTypes.join(".").indexOf(fileType) != -1) ?
alert('That file is OK!') : 
alert("Please only upload files that end in types: \n\n" + (fileTypes.join(" .")) + "\n\nPlease select a new file and try again.");
}
// -->
</script>

Vous pouvez ensuite appeler la fonction à partir d'un événement comme le onClick du bouton ci-dessus, qui ressemble à:

onClick = "TestFileType (this.form.uploadfile.value, ['gif', 'jpg', 'png', 'jpeg']);"

Vous pouvez changer cela en: PDFetXLS

Vous pouvez le voir implémenté ici: Démo

Vishal Suthar
la source
Merci Vishal Suthar. Je pense que cette logique m'aide sûrement à aller de l'avant.
Manikandan
C'est mon plaisir .. Cela aidera sûrement mais toujours pas de vote positif .. ?? @ Manikandan
Vishal Suthar
J'ai encore un doute. J'ai essayé de restreindre les fichiers (PDF et Xls.xlsx uniquement) dans type d'entrée = fichier. Mais cela fonctionne bien dans Google Chrome .. Mais je ne peux pas faire cela dans IE. Existe-t-il une solution pour restreindre les fichiers dans IE? Si oui, faites-moi suivre la bonne voie.
Manikandan
Je viens de vérifier ( codestore.net/store.nsf/unid/DOMM-4Q8H9E ) dans IE et cela fonctionne bien .. @ Manikandan
Vishal Suthar
En comparaison avec l' acceptattribut, cette méthode ne réduit pas le contenu du dossier aux types de fichiers sélectionnés lors de la sélection d'un fichier sur l'ordinateur local.
feeela