Ошибка Jquery: слишком много рекурсии

Я пытаюсь создать систему загрузки файлов, реализующую шифрование на стороне клиента с использованием CryptoJS.

У меня проблема в том, что выполнение скрипта останавливается из-за следующей ошибки в консоли Firebug: too much recursion

Я потратил полдня, пытаясь решить проблему, удаление части var jqxhr = $.ajax устраняет ошибку, но удаляет функцию публикации из моего скрипта. Я попытался удалить все строки шифрования, разделив их на разные функции, но, похоже, ничего не получается. Кто-нибудь из профессионалов jQuery знает, что происходит?

Вот код:

$("#successmsg").hide();
$("#errormsg").hide();

function randomString(n)
{
    var text = '';
    var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    for(var i=0; i < n; i++)
    {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }

    return text;
}


$("#upload").submit(function(event) {
    event.preventDefault();

    input = document.getElementById('file');

    if(!input.files[0]) {
        $("#errormsg").html("No file selected.");
        $("#successmsg").hide();
        $("#errormsg").show();
    }

    fr = new FileReader();

    fr.onload = function() {
        var fname = input.files[0].name;
        var fkey = CryptoJS.SHA256(randomString(128));
        var skey = CryptoJS.SHA256(fkey);

        var fdata = CryptoJS.AES.encrypt(fr.result, "TestPassword");

        var jqxhr = $.ajax({
            url: "/api/files/upload",
            type: "POST",
            data: {
                'name': fname,
                'data': fdata,
                'key': skey
            },
            cache: false,
            dataType: 'json',
            processData: false
        });
    }

    fr.readAsText(input.files[0]);
});

Вот JSFiddle: http://jsfiddle.net/wob66Lc0/


person Liam J    schedule 07.01.2015    source источник
comment
вы уверены, что сообщение не запускает отправку?   -  person juvian    schedule 07.01.2015
comment
Я не уверен, почему происходит рекурсия, но вызов ajax мне кажется неправильным. Если вы передаете объект как данные, у вас не должно быть строки processData: false.   -  person Stryner    schedule 07.01.2015
comment
Как можно отправить почтовый вызов AJAX?   -  person Liam J    schedule 07.01.2015
comment
Вы должны предоставить онлайн-образец, который повторяет вашу проблему   -  person A. Wolff    schedule 07.01.2015
comment
Это не ошибка jQuery, это ошибка времени выполнения JavaScript.   -  person Andrew Theken    schedule 07.01.2015
comment
Добавлен JSFiddle внизу поста. @AndrewTheken: я увидел, что ошибка исходит из файла jQuery.js, поэтому я предположил, что проблема была в jQuery.   -  person Liam J    schedule 07.01.2015


Ответы (1)


Проблема в том, что функции CryptoJS возвращают объекты, а не строки, поэтому перед отправкой их необходимо преобразовать в строки.

    var jqxhr = $.ajax({
        url: "/api/files/upload",
        type: "POST",
        data: {
            'name': fname,
            'data': fdata.toString(),
            'key': skey.toString()
        }
    });

http://jsfiddle.net/wob66Lc0/1/

Также шифрование работает с байтами, а не с текстом, поэтому вы должны читать файл как двоичную строку, а не текст.

fr.readAsBinaryString(input.files[0]); 
person Musa    schedule 07.01.2015
comment
Большое спасибо, это исправило это для меня, хотя readAsBinaryString устарел: developer.mozilla.org/en-US/docs/Web/API/ - person Liam J; 07.01.2015
comment
Если CryptoJS принимает типизированные массивы, вы можете использовать readAsArrayBuffer - person Musa; 07.01.2015