Как определить ограничения на размер файла при загрузке с AJAX? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть веб-приложение ASP.Net MVC, которое должно обрабатывать процесс загрузки файлов.

Для этого я создал пользовательский IHttpHandler, который обрабатывает поток файлов в чанках, используя метод ProcessRequest. Реализация этого не важна для моей проблемы.

Клиентская часть Я использую JQuery для загрузки файла с функцией AJAX, что-то вроде этого:

$.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;
    }
});

Я настроил ограничения на загрузку / запрос в файле web.config, чтобы разрешить файлы размером до 2 ГБ, что, насколько я могу судить, является жестким ограничением в IIS.


Задача

Проблема, с которой я столкнулся, заключается в том, что когда пользователь пытается загрузить файл, размер которого превышает лимит, он не выдает ошибку до тех пор, пока не будет передан весь файл, что может занять несколько минут для больших файлов. Это нежелательный пользовательский опыт, когда пользователю приходится ждать завершения передачи, прежде чем сообщить, что он не может быть обработан.


Вопрос

Итак, мой вопрос, есть ли способ вызвать ошибку ajax, как только загрузка начнется, если файл слишком велик? В идеале я не хочу, чтобы файл отправлялся на сервер, если он все равно будет отклонен.


Дополнительная информация

Для получения дополнительной информации, точка останова в коде IHttpHandler достигается только тогда, когда размер файла находится в пределах лимита, поэтому я ничего не могу сделать, чтобы выдать ошибку.

Обратите внимание, что я не ищу решение, которое включает проверку размера файла с помощью javascript на размер клиента. Хотя в любом случае я, вероятно, буду использовать это как удобную для пользователя меру предосторожности, я хочу найти метод, который приводит к сбою процесса загрузки и прерыванию до отправки всех данных. Однако я открыт для изменений на стороне клиента, которые не зависят от проверки размера файла, например, альтернативного варианта для функции ajax.

Я также пытался поиграться с Application_BeginRequest(), но это не вызывается, если размер файла превышает 2 ГБ, и я не уверен, что есть еще одно событие, которое я могу проверить, которое происходит до этого.

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете проверить свой formData размер, прежде чем позвонить в AJAX.

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;
        }
    });
...