Тело полезной нагрузки Ajax-запроса неправильно отформатировано - PullRequest
0 голосов
/ 01 марта 2012

Я устанавливаю свои заголовки в AJAX POST, и POSTing работает нормально, но тело полезной нагрузки запроса не отформатировано так, как я планировал.

for (var i = 0; i < files.length; i++) {
var boundary = '--AJAX--' + b.util.randomString();
var fileName = files[i].fileName;
var fileSize = files[i].fileSize;
var fileType = files[i].type;

var parts = [];
var part = '';
part += 'Content-Disposition: file;' + CRLF;
part += 'name= "' + fieldName + '"; ' + CRLF;
part += 'filename="' + fileName + '"' + CRLF;
part += 'Content-Type: ' + fileType + ';' + CRLF;
part += 'name="' + 'timestamp' + '"' + CRLF + CRLF;
part += getDateTime() + CRLF;
parts.push(part);

var data = '--' + boundary + CRLF;
data += parts.join('--' + boundary + CRLF);
data += '--' + boundary + '--' + CRLF;

// Wrap in a closure to preserve our increment value [i]
(function(i) {
    files = $.extend(true, {}, files);

    $.ajax({
        url: $form,
        type: 'POST',
        beforeSend: function(xhr) {
            xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
            xhr.setRequestHeader('X-File-Name', fileName);
            xhr.setRequestHeader('X-File-Size', fileSize);
            xhr.setRequestHeader('X-File-Type', fileType);
        },
        data: {
            userfile: data
        },
        success: function(data) {
        },
        error: function(e) {
        }
    });
})(i);
}​

форматируется в:

/*
userfile=--AJAX-----------------------------2Bw0sHPkE4%0D%0AContent-Disposition%3A+file%3B%0D%0Aname%3D+%22userfile%5B%5D%22%3B+filename%3D%22MPK0l.jpg%22%0D%0AContent-Type%3A+image%2Fjpegname%3D%22timestamp%22%0D%0A%0D%0A1330556315.828%0D%0A--AJAX-----------------------------2Bw0sHPkE4--%0D%0A
*/

Что, очевидно, игнорирует все мои разрывы строк и возврат каретки.

Должен ли я явно создать свой объект xhr и использовать xhr.send (), или я могу использовать jQuery ajax () с этим?

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Решено создать объект XHR вместо использования jQuery ajax().

        for (var i = 0, f; f = files[i]; i++) {
            (function(i) {
                var xhr = new XMLHttpRequest();
                var reader = new FileReader();

                xhr.open('POST', $form, true);

                    reader.onload = function(e) {
                    var boundary = '--AJAX--' + b.util.randomString();
                    var binaryFile = e.target.result;
                    var fileName = files[i].fileName;

                    xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
                    xhr.setRequestHeader('X-File-Name', files[i].fileName);
                    xhr.setRequestHeader('X-File-Size', files[i].fileSize);
                    xhr.setRequestHeader('X-File-Type', files[i].type);

                    var parts = [];
                    var part = '';
                    part += 'Content-Disposition: file; ';
                    part += 'name="' + fieldName + '"' + CRLF;
                    part += 'Content-Type: ' + files[i].type;
                    part += CRLF + 'Content-Transfer-Encoding: binary' + CRLF + CRLF;
                    part += binaryFile + CRLF;
                    parts.push(part);

                    part = 'Content-Disposition: form-data; ';
                    part += 'name="' + 'timestamp' + '"' + CRLF + CRLF;
                    part += getDateTime() + CRLF;
                    parts.push(part);

                    var data = '--' + boundary + CRLF;
                    data += parts.join('--' + boundary + CRLF);
                    data += '--' + boundary + '--' + CRLF;
                    xhr.sendAsBinary(data);
                    };
                reader.readAsBinaryString(files[i]);
            })(i);
        }
0 голосов
/ 02 марта 2012

Некоторые цитаты из RFC1867 :

Если выбрано несколько файлов, они должны быть переданы вместе в формате multipart / mixed .

Тип содержимого: multipart / form-data *, * border = AaB03x comma is used, not a semicolon

В конце концов, я не уверен, необработанные данные POST могут быть подготовлены через xhr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...