Подтвердить что ты не робот

Как выполнить сериализацию ввода типа файла в jquery

Ранее с использованием Prototype я мог сериализовать файл входного типа, он дал мне имя файла загружаемого файла, но когда я сериализовал форму в jquery, я просто получил текст типа ввода, а другие - не файл, как это сделать

4b9b3361

Ответ 1

Проведя несколько минут в Firebug, на самом деле есть несколько способов сделать это. Например, мне удалось получить список файлов из самого файла fileObject:

var file = $("#control").attr("files")[0];
var fileName = file.fileName;
var fileSize = file.fileSize;

alert("Uploading: "+fileName+" @ "+fileSize+"bytes");

Ясно, что я могу прочитать значения для сериализации. Но письмо - это еще одна проблема.

Но, по-видимому, это не так просто, как утверждают другие. Я взял на себя смелость загрузить источник Prototype и не смог узнать, где это были инструкции для использования данных FileList для объекта File Upload.

Фактически, я нашел документ в Интернете, в котором были описаны проблемы с сериализацией самого файла загрузки файлов, утверждая, что ни одна библиотека AJAX не сделала это хорошо (обратите внимание, что это было написано в 2007 году). Тем не менее эта тема интересна, и кажется, что вы можете работать с любым количеством методов, чтобы вытащить данные из загрузки файлов. Сама спецификация содержит обширную информацию, которая поможет вам по этому пути.

Мне жаль, что у меня не было ответа о том, как вы можете писать и добавлять файлы в список файлов, но на данный момент я так же потерян, как и вы (или был в то время, когда задавал этот вопрос). С чуть большим чтением это может оказаться намного проще, чем я подозреваю, но на данный момент у меня нет времени инвестировать.

Желаем удачи.

Соответствующая документация:

Ответ 3

Как уже упоминалось, вы можете отправить форму, содержащую входные данные файла через ajax, но для этого требуется какая-то волосатая маска iframe. Если вы не против использования jQuery, я настоятельно рекомендую jquery.forms плагин ajaxSubmit.

Ответ 4

Соответствующая ошибка jQuery: http://bugs.jquery.com/ticket/2656

Я добавил свой собственный метод serializeAll вместо сериализации:

    (function($) { 
    $.fn.serializeAll = function() {
        var rselectTextarea = /^(?:select|textarea)/i;
        var rinput = /^(?:color|date|datetime|datetime-local|email|file|hidden|month|number|password|range|search|tel|text|time|url|week)$/i;
        var rCRLF = /\r?\n/g;

        var arr = this.map(function(){
            return this.elements ? jQuery.makeArray( this.elements ) : this;
        })
        .filter(function(){
            return this.name && !this.disabled &&
                ( this.checked || rselectTextarea.test( this.nodeName ) ||
                    rinput.test( this.type ) );
        })
        .map(function( i, elem ){
            var val = jQuery( this ).val();

            return val == null ?
                null :
                jQuery.isArray( val ) ?
                    jQuery.map( val, function( val, i ){
                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
                    }) :
                    { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
        }).get();

        return $.param(arr);
    }
})(jQuery);

Затем вызовите:

$('#form').serializeAll()

Ответ 5

В источнике прототипа (см. выше) serializeElements различает "element.type! =" файл "и другие. Тип элемента" файл" не сериализуется.