28

我想使用 BlueImp/Jquery File Upload 来将一些图像上传到网络服务器。我有通过阅读许多来源生成的这个 JS 代码

 $('#file_upload').fileupload('option', {
        dataType: 'json',
        url: '/Upload/UploadFiles',
        maxFileSize: 5000000,
        acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
        process: [
            {
                action: 'load',
                fileTypes: /^image\/(gif|jpeg|png)$/,
                maxFileSize: 20000000 // 20MB
            },
            {
                action: 'resize',
                maxWidth: 1440,
                maxHeight: 900
            },
            {
                action: 'save'
            }
        ],
        progressall: function (e, data) {
            $(this).find('.progressbar').progressbar({ value: parseInt(data.loaded / data.total * 100, 10) });
        },
        done: function (e, data) {
            $('#show_image').append('<img src="' + data.result[0].ThumbURL + '" />');
            $('#imgID').val($('#imgID').val() + data.result[0].Id + ',');
            $(this).find('.progressbar').progressbar({ value: 100 });
        },
        error: function (e, data) {
            var a = 1;
        }
    });
});

它之所以有效,是因为它不会上传任何不是图像的文件,但我希望能够获取错误消息(如果存在)以显示给用户。

他们的演示中,他们有一些代码(jquery.fileupload-ui.js 和 jquery.fileupload-fp.js)可以“神奇地”创建带有错误的 HTML(我仍在努力理解它)。

我真的不知道我是否也应该使用这些插件并以某种方式自定义生成的 HTML,或者手动获取信息并填充它是否更简单。

我对 JS 和 Jquery 很陌生,所以也许我遗漏了一些东西。

如何配置正在生成的 HTML 或如何获取错误消息?

谢谢,奥斯卡

4

9 回答 9

36

我知道这是一个旧线程,但如果有人仍在寻找如何获取错误消息,这里有一种方法:

$('#fileupload').bind('fileuploadprocessfail', function (e, data) {
    alert(data.files[data.index].error);
});
于 2013-11-16T11:44:12.907 回答
16

为此,您可以使用文件添加回调来验证文件,就像这样,使用“return false”来避免添加该文件;

 $('#yourfileuploader').fileupload({
                    add: function (e, data) {
                        var fileType = data.files[0].name.split('.').pop(), allowdtypes = 'jpeg,jpg,png,gif';
                        if (allowdtypes.indexOf(fileType) < 0) {
                            alert('Invalid file type, aborted');
                            return false;
                        }

                    }
                });

或者您可以像这样注册 fileuploadadded 回调,

$('#yourfileuploader').fileupload().bind('fileuploadadded', function (e, data) {
                    var fileType = data.files[0].name.split('.').pop(), allowdtypes = 'jpeg,jpg,png,gif';
                    if (allowdtypes.indexOf(fileType) < 0) {
                        alert('Invalid file type, aborted');
                        return false;
                    }
                });

您还可以使用以下方式访问 fileupload acceptFileTypes 选项;e.originalEvent.data.fileupload.options.acceptFileTypes

您可以在这里找到更多信息;

https://github.com/blueimp/jQuery-File-Upload/wiki/Options

于 2013-05-24T14:06:38.240 回答
14

正如 user2999209 所提到的,正确的方法是使用fileuploadprocessfail回调。

要完成他的回答,如果您希望翻译错误消息,您应该传递以下(未记录的)选项:

$('#my-uploader').fileupload({
    // ... some options ...
    messages : {
      maxNumberOfFiles: 'AAA Maximum number of files exceeded',
      acceptFileTypes: 'AAA File type not allowed',
      maxFileSize: 'AAA File is too large',
      minFileSize: 'AAA File is too small'
      uploadedBytes : 'AAA Uploaded bytes exceed file size'
    },
    // ... some other options ...
  })
  .on("fileuploadprocessfail", function(e, data) {
    var file = data.files[data.index];
    alert(file.error);
  });

尝试上传文件类型错误的文件将导致显示消息“不允许使用 AAA 文件类型”。

于 2016-04-16T21:59:11.723 回答
6

如果您使用的是 PHP 服务器,我有一个更简单的解决方案。如果您不是,我相信这也可能对您有所帮助。

您不需要在前端使用 acceptFileTypes 参数。只需使用以下参数初始化 PHP UploadHandler 类:

array(
    'accept_file_types' => '/\.(gif|jpe?g|png)$/i',
    'upload_url' => 'uploads/', // both of upload_url, upload_dir equals to the upload destination
    'upload_dir' => 'uploads/',
    'max_file_size' => 1024*1024*2 // in byte
)

当您传递不需要的文件类型或文件大小时,ajax 返回将类似于

{name: "Dream Come True.mp3", size: 14949044, type: "audio/mp3", error: "File type not allowed"} 

或者

{name: "feng (3).jpg", size: 634031, type: "image/jpeg", error: "File is too big"}
于 2013-10-06T09:47:38.233 回答
5

使用processfail回调

$('#fileupload').fileupload({
    maxFileSize: 5000000,
    done: function (e, data) {
        $.each(data.result.logo, function (index, file) {
            $('<p/>').text(file.name).appendTo('#fileupload-files');
        });
    },
    processfail: function (e, data) {
        alert(data.files[data.index].name + "\n" + data.files[data.index].error);
    }
});
于 2013-12-17T15:43:00.033 回答
2

加载脚本的顺序对于在默认验证过程中显示错误消息很重要,

此订单对我有用:

  1. tmpl.min.js
  2. jquery.ui.widget.js
  3. jquery.iframe-transport.js
  4. jquery.fileupload.js
  5. jquery.fileupload-ui.js
  6. jquery.fileupload-process.js
  7. jquery.fileupload-validate.js
于 2014-11-20T14:48:49.510 回答
1

验证文件类型(可能是“图像/jpeg”之类的格式)比扩展更好。在这种情况下,您可以避免区分大小写和类似意外问题的潜在问题

$('#yourfileuploader').fileupload().bind('fileuploadadded', function (e, data) {
                    var fileType = data.files[0].type;
                    if (type.indexOf('image') < 0) {
                        alert('Invalid file type, aborted');
                        return false;
                    }
                });
于 2016-02-09T23:14:33.017 回答
0

如果您不熟悉 javascript 错误处理的工作原理,最好阅读以下主题:try/catch (MDN)

但是,错误实际上是fileupload原型中的一个方法,所以理论上这个函数会在错误发生时执行。

只需将 {your code} 添加到方法中的 errorHandler 即可。

...
error: function (e, data) {
        var a = 1; // <--in your example, this does nothing.
        alert(e); // <--or whatever you wish to do with the error
        return a; // <--did you want to return true?
    }
...

如果此警报从未发生,则不会引发错误。以下代码通常是您捕获它们的方式。(它还没有这样做?)

try {

  ...any code you want to exception handle with...

  }
  catch (e) {      
    alert(e);
  }
于 2013-02-15T19:39:36.860 回答
0

我在这些回答中发现的任何内容都没有对我有用,而且奇怪的是,为该插件编写演示的开发人员使用的样式与文档中描述的样式不同。无论如何,这是题外话。

我复制了他们用来让 UI 版本工作的代码,这最终对我有用。他们使用 .on 方法和 'processalways' 来检查错误,而不是使用 'error' 或 'fail' 方法。

查看源代码:http: //blueimp.github.io/jQuery-File-Upload/basic-plus.html

这是源代码。

干杯

于 2015-08-03T16:52:24.293 回答