使用AJAX上传时,如何尽早检测文件大小限制?

时间:2019-04-23 08:55:25

标签: jquery ajax asp.net-mvc iis-express

我有一个ASP.Net MVC Web应用程序,该应用程序需要处理文件上传进度。

为此,我创建了一个自定义IHttpHandler,该自定义ProcessRequest使用$.ajax({ url: '@Url.RouteUrl("Uploads")', type: 'POST', headers: { 'Filename': file.name }, data: formData, cache: false, contentType: false, processData: false, xhr: function () { var myXhr = $.ajaxSettings.xhr(); if (myXhr.upload) { myXhr.upload.addEventListener('progress', function (e) { if (e.lengthComputable) { $('progress').attr({ value: e.loaded, max: e.total, }); } }, false); } myXhr.addEventListener('load', function (e) { console.log('upload complete'); }); return myXhr; } }); 方法来分块处理文件流。对于我的问题来说,实现这一点并不重要。

客户端我正在使用JQuery通过AJAX函数上传文件,如下所示:

Application_BeginRequest()

我已经在web.config中配置了上传/请求限制,以允许最大2GB的文件,据我所知,这仍然是IIS中的硬限制。


问题

我遇到的问题是,当用户尝试上传大于限制的文件时,在整个文件传输完毕之前,它不会引发错误,对于大型文件可能要花几分钟。对于用户来说,这是一种不希望的用户体验,必须等待传输完成才被告知无法处理。


问题

所以我的问题是,如果文件太大,是否在上载开始后立即使ajax函数出错?理想情况下,如果无论如何它只会被拒绝,我不希望将文件发送到服务器。


其他信息

有关其他信息,仅当文件大小在限制范围内时,才会击中IHttpHandler代码中的断点,因此我无法在其中执行任何操作以引发错误。

请注意,我正在寻找一种解决方案,该解决方案涉及使用客户端大小上的javascript检查文件大小。尽管无论如何我都可能将其用作用户友好的预防措施,但我想找到一种方法,该方法会导致上传过程在发送所有数据之前失败并中止。但是,我愿意接受不依赖文件大小检查的客户端更改,例如ajax函数的替代选项。

我也尝试过使用this.child = React.createRef(),但是如果文件大于2GB,则不会调用此函数,而且我不确定是否可以再检查一次此事件。

1 个答案:

答案 0 :(得分:0)

您可以在调用ajax之前检查formData的大小。

var size = formData.get('fileName_key').size  // calculate your size accordingly

if(size>your_2gb_size) return false;

    $.ajax({
        url: '@Url.RouteUrl("Uploads")',
        type: 'POST',
        headers: { 'Filename': file.name },
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        xhr: function () {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                myXhr.upload.addEventListener('progress', function (e) {
                    if (e.lengthComputable) {
                        $('progress').attr({
                            value: e.loaded,
                            max: e.total,
                        });
                    }
                }, false);
            }
            myXhr.addEventListener('load', function (e) {
                console.log('upload complete');
            });
            return myXhr;
        }
    });