Получить Base64 кодировать файлы-данные из формы ввода

У меня есть базовая HTML-форма, из которой я могу получить немного информации, которую я изучаю в Firebug.

Мои единственные проблемы в том, что я пытаюсь base64 кодировать данные файла перед его отправкой на сервер, где он должен быть в этой форме для сохранения в базе данных.

<input type="file" id="fileupload" />

И в Javascript + jQuery:

var file = $('#fileupload').attr("files")[0];

У меня есть некоторые операции, основанные на доступном javascript:.getAsBinary(),.getAsText(),.getAsTextURL

Однако ни один из них не возвращает полезный текст, который может быть вставлен, поскольку они содержат непригодные "символы" - я не хочу иметь "postback" в моем загруженном файле, и мне нужно иметь несколько форм, предназначенных для определенных объектов, поэтому важно, чтобы я получил файл и использовал Javascript таким образом.

Как мне получить файл таким образом, чтобы я мог использовать один из кодов Javascript base64, которые широко доступны!?

Спасибо

Обновление - запустив баунти здесь, нужна поддержка кросс-браузера!!!

Вот где я нахожусь:

<input type="file" id="fileuploadform" />

<script type="text/javascript>
var uploadformid = 'fileuploadform';
var uploadform = document.getElementById(uploadformid);


/* method to fetch and encode specific file here based on different browsers */

</script>

Пара проблем с поддержкой кросс-браузера:

var file = $j(fileUpload.toString()).attr('files')[0];
fileBody = file.getAsDataURL(); // only works in Firefox

Кроме того, IE не поддерживает:

var file = $j(fileUpload.toString()).attr('files')[0];

Поэтому мне нужно заменить на:

var element = 'id';
var element = document.getElementById(id);

Для поддержки IE.

Это работает в Firefox, Chrome, Safari (но неправильно кодирует файл или, по крайней мере, после его публикации, файл не получается)

var file = $j(fileUpload.toString()).attr('files')[0];
var encoded = Btoa(file);

Кроме того,

file.readAsArrayBuffer() 

Кажется, поддерживается только в HTML5?

Много людей предложили: http://www.webtoolkit.info/javascript-base64.html

Но это только возвращает ошибку en на методе UTF_8, прежде чем он будет кодировать base64? (или пустую строку)

var encoded = Base64.encode(file); 

Ответы

Ответ 1

Это вполне возможно в javascript на стороне браузера.

Простой способ:

Метод readAsDataURL() может уже кодировать его как base64 для вас. Вам, вероятно, придется разбить начальные вещи (до первого), но это не biggie. Это займет все самое интересное.

Трудный путь:

Если вы хотите попробовать это трудно (или оно не работает), посмотрите readAsArrayBuffer(). Это даст вам Uint8Array, и вы можете использовать указанный метод. Это, вероятно, полезно только в том случае, если вы хотите возиться с самими данными, например, манипулировать данными изображения или делать другую магию вуду перед загрузкой.

Существует два метода:

  • Преобразование в строку и использование встроенного btoa или аналогичного
    • Я не тестировал все случаи, но работает для меня - просто получим char -коды
  • Преобразование непосредственно из Uint8Array в base64

Недавно я реализовал tar в браузере. В рамках этого процесса я сделал свою собственную прямую реализацию Uint8Array- > base64. Я не думаю, что вам это понадобится, но здесь, если вы хотите взглянуть; это довольно аккуратно.

Что я делаю сейчас:

Код для преобразования в строку из Uint8Array довольно прост (где buf - это Uint8Array):

function uint8ToString(buf) {
    var i, length, out = '';
    for (i = 0, length = buf.length; i < length; i += 1) {
        out += String.fromCharCode(buf[i]);
    }
    return out;
}

Оттуда просто выполните:

var base64 = btoa(uint8ToString(yourUint8Array));

Base64 теперь будет кодировкой base64, и он должен быть загружен просто персиковым. Попробуйте это, если вы хотите дважды проверить, прежде чем нажимать:

window.open("data:application/octet-stream;base64," + base64);

Это загрузит его как файл.

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

Чтобы получить данные в виде Uint8Array, просмотрите документы MDN:

Ответ 2

Я использовал FileReader для отображения изображения при нажатии кнопки загрузки файла, не используя никаких запросов Ajax. Ниже приведен код, который может помочь кому-то.

$(document).ready(function($) {
    $.extend( true, jQuery.fn, {        
        imagePreview: function( options ){          
            var defaults = {};
            if( options ){
                $.extend( true, defaults, options );
            }
            $.each( this, function(){
                var $this = $( this );              
                $this.bind( 'change', function( evt ){

                    var files = evt.target.files; // FileList object
                    // Loop through the FileList and render image files as thumbnails.
                    for (var i = 0, f; f = files[i]; i++) {
                        // Only process image files.
                        if (!f.type.match('image.*')) {
                        continue;
                        }
                        var reader = new FileReader();
                        // Closure to capture the file information.
                        reader.onload = (function(theFile) {
                            return function(e) {
                                // Render thumbnail.
                                    $('#imageURL').attr('src',e.target.result);                         
                            };
                        })(f);
                        // Read in the image file as a data URL.
                        reader.readAsDataURL(f);
                    }

                });
            });
        }   
    });
    $( '#fileinput' ).imagePreview();
});

Ответ 3

Моим решением было использование readAsBinaryString() и btoa() по его результату.

uploadFileToServer(event) {
    var file = event.srcElement.files[0];
    console.log(file);
    var reader = new FileReader();
    reader.readAsBinaryString(file);

    reader.onload = function() {
        console.log(btoa(reader.result));
    };
    reader.onerror = function() {
        console.log('there are some problems');
    };
}

Ответ 4

После этого я начал реализовывать FileReader для браузеров, которые его поддерживают (Chrome, Firefox и еще неизданный Safari 6), а также PHP script, который возвращает данные POSTed обратно в качестве Base64- закодированные данные для других браузеров.

Ответ 5

Я начал думать, что использование "iframe" для загрузки в стиле Ajax может быть намного лучшим выбором для моей ситуации, пока HTML5 не станет полным, и мне не нужно поддерживать устаревшие браузеры в моем приложении!