11
votes

Vérification du type de fichier HTML5 glisser-déposer

Je voudrais changer la couleur de fond de zone de goutte en vert ou en rouge selon que la charge utile de glisser contenue contient des types de fichiers pris en charge (JPEG).

  • Do gecko et webkit support en déterminer le type de fichier de fichiers de glisser-déposer?

  • Comment l'on peut extraire le type de fichier dans ces deux navigateurs?

    J'ai trouvé l'événement.datransfer.types API, mais pour Firefox, il semble être renseigné avec Application / X-Moz-file et donc je pense que je fais quelque chose de mal.


1 commentaires

Devrait fonctionner dans Gecko, WebKit restreint l'accès à l'objet de transfert de données à la traînée. Quel code avez-vous pour le moment?


3 Réponses :


1
votes

Je ne pense pas que vous puissiez compter sur le navigateur pour vous donner le type MIME. Ce serait beaucoup plus simple si vous avez vérifié l'extension du nom de fichier. :)

Si vous souhaitez vraiment vérifier le type de fichier, lisez la charge utile à l'aide de datransfer.getdata () et vérifiez les principaux octets ( png , gif89 , jFIF ou quelque chose).


1 commentaires

Vous pensez donc vraiment que l'extension du nom de fichier est une indication plus digne de confiance du type de fichier ??? Vérification des données est le seul moyen de vous assurer. Le fichier magique comme on l'appelle.



15
votes

Vous pouvez obtenir les types de fichiers dans Gecko et Webkit ont pris en charge les navigateurs pris en charge à l'aide d'un objet de fichier.

var mimeType= files[0].type; //mime type of file list first entry


6 commentaires

Pourquoi || E.Target.files retombe? Prend-il en compte quelques cas inattendus ou quelque chose?


Notez que ce type MIME est généré à l'aide de l'extension de fichier (c'est-à-dire le .gif ou .jpeg à la fin du nom de fichier.) Ceci ne sera définitivement pas le type réel du fichier dans tous les cas. Beaucoup de gens vont mettre .jpg quand ils sauveront un fichier PNG ou BMP ... parce qu'ils connaissent .jpg signifie "image".


@Alexiswilke, je pense que votre cas est un cas d'angle extrême. La plupart des gens lors de la sauvegarde d'un fichier ne tapent pas l'extension (ou il est caché) dans Windows. Mais plus important encore, je doute que la plupart des programmes ont une détection de retombée pour déterminer le fichier de filet de la part des données lui-même lorsque l'extension ne correspond pas. Par exemple. Ajout de .jpg à la fin d'un fichier PNG et essayant de l'ouvrir dans Photoshop (l'éditeur de photos n ° 1) conduit à Photoshop jetant une erreur selon laquelle il s'agit d'un JPG invlaid. Si vous avez une détection d'extension et que l'utilisateur le modifie au mauvais, c'est leur problème, pas le vôtre. Crap in, merde dehors.


@Chrisjanssen Dans le même temps, nous parlons de fichiers qui seront envoyés par la personne A au serveur B qui sert ensuite le même fichier à la personne c ...


Et pourquoi le type de filet est-il changeant le long de ce chemin? Chaque système d'exploitation utilise le fichier de type pour déterminer ce qu'est un fichier et quel programme approprié pour l'ouvrir avec, il n'étilise pas les données de début pour effectuer cette décision, elle fait confiance à ce que le type de fichier n'a pas été changé. Dans la plupart des cas, il avertit l'utilisateur de ne pas modifier de type type car il peut arrêter de fonctionner. Pourquoi ne pas simplement le garder simple et vérifier le type de fichier?


J'essaie de le faire avec un événement Dragenter dans la dernière version de Firefox, mais les fichiers sont NULL ...



6
votes

Test du type d'un fichier dans JavaScript est un peu de travail, mais de nouvelles versions des navigateurs ont désormais l'objet code> fileader CODE> qui vous permet de le faire.

Il y a une référence incomplète à ma mise en oeuvre qui lit le tampon comme UT8 octets, puis vérifie si l'entrée est un JPEG valide, GIF, PNG. De toute évidence, il sera amélioré avec le temps. Pour une version plus complète, recherchez le fichier Editor.js code> dans le plugin de l'éditeur du projet snapwebsites em>. https://sourceforge.net/p/snapcppp / Code / CI / Master / Tree / SnapWebsites / Plugins / Editor / P>

// The buffer is expected to be an ArrayBuffer() as read with a FileReader
_buffer2mime: function(buffer)
{
    buf = Uint8Array(buffer);
    if(buf[0] == 0xFF
    && buf[1] == 0xD8
    && buf[2] == 0xFF
    && buf[3] == 0xE0
    && buf[4] == 0x00
    && buf[5] == 0x10
    && buf[6] == 0x4A  // J
    && buf[7] == 0x46  // F
    && buf[8] == 0x49  // I
    && buf[9] == 0x46) // F
    {
        return "image/jpeg";
    }
    if(buf[0] == 0x89
    && buf[1] == 0x50  // P
    && buf[2] == 0x4E  // N
    && buf[3] == 0x47  // G
    && buf[4] == 0x0D  // \r
    && buf[5] == 0x0A) // \n
    {
        return "image/png";
    }
    if(buf[0] == 0x47  // G
    && buf[1] == 0x49  // I
    && buf[2] == 0x46  // F
    && buf[3] == 0x38  // 8
    && buf[4] == 0x39  // 9
    && buf[5] == 0x61) // a
    {
        return "image/gif";
    }

    // unknown
    return "";
},

_droppedImageAssign: function(e){
    var img,id;
    img = new Image();
    img.src = e.target.result;
    ++this._uniqueId;
    id="snap-editor-image-"+this._uniqueId;
    jQuery(img).hide().attr("id",id).appendTo(e.target.snapEditorElement);
    jQuery("#"+id).show();
},

_droppedImage: function(e){
    var mime, r, a, blob;

    mime = snapwebsites.EditorInstance._buffer2mime(e.target.result);
    if(mime.substr(0, 6) == "image/")
    {
        r = new FileReader;
        r.snapEditorElement = e.target.snapEditorElement;
        r.onload = snapwebsites.EditorInstance._droppedImageAssign;
        a = [];
        a.push(e.target.snapEditorFile);
        blob = new Blob(a, {type: mime}); // <- FORCE THE REAL MIME TYPE
        r.readAsDataURL(blob);
    }
},

jQuery("#some-object")
        .on("drop",function(e){
            // always prevent the default dropping mechanism
            // we handle the file manually all the way
            e.preventDefault();
            e.stopPropagation();

            // anything transferred on widget that accepts files?
            if(e.originalEvent.dataTransfer
            && e.originalEvent.dataTransfer.files.length)
            {
                accept_images = jQuery(this).hasClass("image");
                accept_files = jQuery(this).hasClass("attachment");
                if(accept_images || accept_files)
                {
                    for(i = 0; i < e.originalEvent.dataTransfer.files.length; ++i)
                    {
                        // read the image so we can make sure it is indeed an
                        // image and ignore any other type of files
                        r = new FileReader;
                        r.snapEditorElement = this;
                        r.snapEditorFile = e.originalEvent.dataTransfer.files[i];
                        r.onload = snapwebsites.EditorInstance._droppedImage;
                        // Get the first 64 bytes of the file to check the magic code
                        r.readAsArrayBuffer(r.snapEditorFile.slice(0, 64));
                    }
                }
            }

            return false;
        })


0 commentaires