86 votes

maxFileSize et acceptFileTypes dans le plugin de téléchargement de fichiers de blueimp ne fonctionnent pas. Pourquoi ?

J'utilise le plugin Blueimp jQuery file upload pour télécharger des fichiers.

Je n'ai eu aucun problème pour télécharger mais l'option maxFileSize y acceptFileTypes ne fonctionnent pas.

Voici mon code :

$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        dataType: 'json',
        autoUpload: false,
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('<p style="color: green;">' + file.name + '<i class="elusive-ok" style="padding-left:10px;"/> - Type: ' + file.type + ' - Size: ' + file.size + ' byte</p>')
                    .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('<p style="color: red;">Upload file error: ' + error + '<i class="elusive-remove" style="padding-left:10px;"/></p>')
                    .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});

0 votes

Bonjour, j'essaie d'implémenter ce code pour le téléchargement de fichiers mais j'obtiens l'erreur suivante : Erreur de téléchargement de fichier : Uploaded bytes exceed file size Pouvez-vous s'il vous plaît suggérer quelle est la cause ?

2 votes

@JayMaharjan Êtes-vous sûr que le maxFileSize est correctement configuré ?

1 votes

Après avoir effectué la configuration appropriée dans le php.ini, je suis maintenant en mesure de télécharger des fichiers volumineux. Merci pour votre aide :)

138voto

PaulMrG Points 649

J'ai eu le même problème, et le gars de Blueimp a dit " maxFileSize et acceptFileTypes ne sont supportés que par la version IU. "et a fourni un lien (cassé) pour intégrer les méthodes _validate et _hasError.

Donc sans savoir comment intégrer ces méthodes sans bousiller le script j'ai écrit cette petite fonction. Elle semble fonctionner pour moi.

Ajoutez simplement ceci

add: function(e, data) {
        var uploadErrors = [];
        var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
        if(data.originalFiles[0]['type'].length && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
            uploadErrors.push('Not an accepted file type');
        }
        if(data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) {
            uploadErrors.push('Filesize is too big');
        }
        if(uploadErrors.length > 0) {
            alert(uploadErrors.join("\n"));
        } else {
            data.submit();
        }
},

au début des options .fileupload comme indiqué dans votre code ici

$(document).ready(function () {
    'use strict';

    $('#fileupload').fileupload({
        add: function(e, data) {
                var uploadErrors = [];
                var acceptFileTypes = /^image\/(gif|jpe?g|png)$/i;
                if(data.originalFiles[0]['type'].length && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
                    uploadErrors.push('Not an accepted file type');
                }
                if(data.originalFiles[0]['size'].length && data.originalFiles[0]['size'] > 5000000) {
                    uploadErrors.push('Filesize is too big');
                }
                if(uploadErrors.length > 0) {
                    alert(uploadErrors.join("\n"));
                } else {
                    data.submit();
                }
        },
        dataType: 'json',
        autoUpload: false,
        // acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        // maxFileSize: 5000000,
        done: function (e, data) {
            $.each(data.result.files, function (index, file) {
                $('<p style="color: green;">' + file.name + '<i class="elusive-ok" style="padding-left:10px;"/> - Type: ' + file.type + ' - Size: ' + file.size + ' byte</p>')
                .appendTo('#div_files');
            });
        },
        fail: function (e, data) {
            $.each(data.messages, function (index, error) {
                $('<p style="color: red;">Upload file error: ' + error + '<i class="elusive-remove" style="padding-left:10px;"/></p>')
                .appendTo('#div_files');
            });
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);

            $('#progress .bar').css('width', progress + '%');
        }
    });
});

Vous remarquerez que j'ai également ajouté une fonction de taille de fichier, car elle ne fonctionnera également que dans la version IU.

Mis à jour pour dépasser le problème suggéré par @lopsided : Ajouté data.originalFiles[0]['type'].length y data.originalFiles[0]['size'].length dans les requêtes pour s'assurer qu'elles existent et ne sont pas vides avant de tester les erreurs. S'ils n'existent pas, aucune erreur ne sera affichée et le test d'erreur côté serveur sera suffisant.

0 votes

C'est vraiment utile. Toutefois, il convient de noter que data.originalFiles[0]['type'] est vide lors du téléchargement à partir d'un navigateur qui ne prend pas en charge l'API fichier. C'était le cas sur mon téléphone Android. Ce que j'ai fait, c'est de le passer si cette valeur n'est pas disponible, puis de me rabattre sur la validation du type de mime côté serveur. Sinon, vous ne dépassez jamais la valeur acceptFileTypes.test ligne

0 votes

@lopsided c'est étrange, j'obtiens la valeur pour data.originalFiles[0]['type'] et ['size'] sur mon téléphone Android et il passe les deux tests. En fait, j'ai des problèmes avec mon téléphone où tout semble fonctionner sans erreur mais le fichier n'est pas téléchargé. Je n'ai aucun problème ailleurs, juste avec Android.

0 votes

Je n'ai pas passé beaucoup de temps à étudier cette question, mais j'ai vu dans la jquery.fileupload.js autour de la ligne 1073, l'élément _getSingleFileInputFiles dispose d'un certain nombre de solutions de repli pour obtenir l'objet d'information sur le fichier. Il y a un commentaire qui dit // If the files property is not available, the browser does not support the File API and we add a pseudo File object with the input value as name with path information removed Cela signifie donc que le test que vous proposez (bien qu'utile et fonctionnant probablement pour plus de 90 % des cas d'utilisation) n'est pas fiable à 100 %, comme je l'ai constaté.

49voto

lboullo0 Points 326

Vous devez inclure jquery.fileupload-process.js y jquery.fileupload-validate.js pour que ça marche.

4 votes

Cela semble être la meilleure réponse ;)

8 votes

L'ordre de chargement des scripts est important pour faire apparaître le message d'erreur : tmpl.min.js > jquery.ui.widget.js > jquery.iframe-transport.js > jquery.fileupload.js > jquery.fileupload-ui.js > jquery.fileupload-process.js > jquery.fileupload-validate.js

3 votes

Le problème est le même, pouvez-vous fournir un exemple de travail s'il vous plaît ?

10voto

Amith George Points 3838

Comme suggéré dans une précédente réponse, nous avons besoin d'inclure deux fichiers supplémentaires - jquery.fileupload-process.js puis jquery.fileupload-validate.js Cependant que j'en ai besoin pour effectuer certaines supplémentaires appels ajax lors de l'ajout d'un fichier, je m'abonne à l' fileuploadadd événement pour effectuer ces appels. Concernant l'utilisation de l'auteur de ce plugin a proposé les éléments suivants

Jetez un œil ici: https://github.com/blueimp/jQuery-File-Upload/wiki/Options#wiki-callback-options

Ajouter des écouteurs d'événement via bind (ou sur la méthode avec jQuery 1.7+) méthode est la meilleure option pour conserver rappel des paramètres par le jQuery File Upload de l'INTERFACE utilisateur de la version.

Alternativement, vous pouvez aussi tout simplement commencer le traitement dans votre propre rappel, comme ceci: https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.fileupload-process.js#L50

À l'aide de la combinaison des deux options proposées, le code suivant fonctionne parfaitement pour moi

$fileInput.fileupload({
    url: 'upload_url',
    type: 'POST',
    dataType: 'json',
    autoUpload: false,
    disableValidation: false,
    maxFileSize: 1024 * 1024,
    messages: {
        maxFileSize: 'File exceeds maximum allowed size of 1MB',
    }
});

$fileInput.on('fileuploadadd', function(evt, data) {
    var $this = $(this);
    var validation = data.process(function () {
        return $this.fileupload('process', data);
    });

    validation.done(function() {
        makeAjaxCall('some_other_url', { fileName: data.files[0].name, fileSizeInBytes: data.files[0].size })
            .done(function(resp) {
                data.formData = data.formData || {};
                data.formData.someData = resp.SomeData;
                data.submit();
        });
    });
    validation.fail(function(data) {
        console.log('Upload error: ' + data.files[0].error);
    });
});

1 votes

Amith, j'ai essayé cela et j'ai obtenu l'erreur suivante : Uncaught Error: cannot call methods on fileupload prior to initialization; attempted to call method 'process'

1 votes

Cela signifie presque toujours que .fileupload() n'a pas été appelé au bon moment. Sans voir le code, il est presque impossible de faire un diagnostic. Je suggère d'ouvrir une nouvelle question et de poster le code correspondant, peut-être sous forme de jsfiddle.

0 votes

@TheVillageIdiot Essayez-vous d'établir la logique de 'fileuploadadd' à l'intérieur de la déclaration $fileInput.fileupload ? J'ai eu une erreur similaire lorsque j'ai essayé d'intégrer l'exemple d'Amith dans quelque chose comme ceci : $('#fileupload').fileupload({ blah : blah, blah : blah, }) $fileInput.on('fileuploadadd', function(evt, data) { var $this = $(this); var validation = data.process(function () { return $this.fileupload('process', data); }); ... C'était évident quand j'y pensais, mais j'essayais de définir la logique à l'intérieur de quelque chose que je n'avais pas encore fini de déclarer.

8voto

nasatome Points 11

Cela fonctionne pour moi dans firefox

$('#fileupload').fileupload({

    dataType: 'json',
    //acceptFileTypes: /(\.|\/)(xml|pdf)$/i,
    //maxFileSize: 15000000,

    add: function (e, data) {
        var uploadErrors = [];

        var acceptFileTypes = /\/(pdf|xml)$/i;
        if(data.originalFiles[0]['type'].length && !acceptFileTypes.test(data.originalFiles[0]['type'])) {
            uploadErrors.push('File type not accepted');
        }

        console.log(data.originalFiles[0]['size']) ;
        if (data.originalFiles[0]['size'] > 5000000) {
            uploadErrors.push('Filesize too big');
        }
        if(uploadErrors.length > 0) {
            alert(uploadErrors.join("\n"));
        } else {
            data.context = $('<p/>').text('Uploading...').appendTo(document.body);
            data.submit();
        }

    },
    done: function (e, data) {
        data.context.text('Success!.');
    }
});

3 votes

Bienvenue à Stack Overflow ! Pourriez-vous réécrire cette réponse pour qu'elle soit en anglais ? Je sais que les traducteurs automatiques peuvent parfois rendre la chose difficile à dire, mais l'anglais est la seule langue (hors programmation) que nous utilisons ici.

15 votes

Attention, il ne faut pas être un linguiste rusé pour comprendre que nasatome dit "Cela fonctionne pour moi : c'est correct dans firefox". L'erreur de téléchargement est "taille du fichier trop grande". Je suis australien et j'ai grandi en parlant anglais, mais je pense qu'il y a une certaine attitude anglophone. "L'anglais est la seule langue que nous utilisons ici" n'est pas vrai. Les gens ici utilisent de nombreuses langues différentes. Cependant, la politique de ce site est d'avoir des questions et des réponses en anglais.

3voto

duan Points 19

Ouvrez le fichier nommé "jquery.fileupload-ui.js", vous verrez le code comme ceci :

 $.widget('blueimp.fileupload', $.blueimp.fileupload, {

    options: {
        // By default, files added to the widget are uploaded as soon
        // as the user clicks on the start buttons. To enable automatic
        // uploads, set the following option to true:
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        autoUpload: false,
        // The ID of the upload template:
        uploadTemplateId: 'template-upload',
        // The ID of the download template:
        downloadTemplateId: 'template-download',
        。。。。

il suffit d'ajouter une ligne de code --- le nouvel attribut "acceptFileTypes", comme ceci :

 options: {
        // By default, files added to the widget are uploaded as soon
        // as the user clicks on the start buttons. To enable automatic
        // uploads, set the following option to true:
        **acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,**
        autoUpload: false,
        // The ID of the upload template:
        uploadTemplateId: 'template-upload',
        // The ID of the download template:
        downloadTemplateId: 'template-d

maintenant tu vas voir que tout va bien ! tu prends juste l'attribut avec un mauvais endroit.

0 votes

C'est une mauvaise idée de modifier le code principal d'un plugin ou d'une bibliothèque si vous pouvez l'éviter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X