2016-08-17 4 views
1

Я передаю данные из файла upload a la javascript FileReader - parsing long file in chunks.Как вы можете объединить данные?

В основном его чтение файла в куски, выполнив:

var r = new FileReader() 
var blob = file.slice(curPosition, curPosition+chunkSize); 
r.onload = function(e) { 
    emit('data', e.target.result 
} 
r.readAsDataURL(blob) 

Он делает это столько раз, сколько необходимо, чтобы прочитать весь файл.

Но когда я это делаю, я получаю преамбулу данных-url каждый раз, затем кучу данных base64. Даже когда я удаляю преамбулу, простая конкатенация строк не работает (файл заканчивается поврежденным).

Как вы можете объединить два URL-адреса данных? Или, действительно, я думаю, что этот вопрос сводится к следующему: как вы объединяете две строки base64?

В качестве альтернативы, как вы создаете URL-адрес данных в чистом javascript?

+0

Можете ли вы дать нам более подробную информацию? –

+0

@ A.J. Случайно представили его, ребята, держите yer dern pernts ern. –

+0

_ «Я передаю данные из загрузки файлов» _ Что вы подразумеваете под «потоковыми данными»? К какому элементу? Почему было бы больше, чем один «URI данных»? Вы пытаетесь сделать несколько файлов последовательно в 'HTMLMediaElement'? _ «Я получаю его преамбулу» _ Что такое «преамбула»? – guest271314

ответ

1

Если вы хотите объединить два в кодировке base64 строки, попробуйте следующее:

var data1 = ..., data2 = ...; // base64 encoded 
var bothData = atob(data1) + atob(data2); // binary string 
var bothData64 = btoa(bothData); // base64 encoded 

atob преобразует base64 в равнинных старых (бинарных) строк, которые могут быть объединены, как обычно. Если вы хотите преобразовать его обратно в base64, используйте btoa. См. MDN article.

Если вы хотите, чтобы поток файл в data: URL, вы можете также использовать .readAsArrayBuffer(), сцепить результаты (см this) и преобразовать ArrayBuffer в base64 (см this).

+0

' Не удалось выполнить 'atob' on 'Window': строка, подлежащая декодированию, некорректно закодирована' Что будет результатом 'bothData'? – guest271314

+0

'data1' и' data2' должны быть только частью base64 'data:' URL, например, без 'data: foo/bar; base64,' – qxz

+0

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

0

Вы можете использовать .readAsArrayBuffer(), progress, load, loadend события FileReader создать новый Blob или File объект, или поток каждый байт данных, возвращаемых в качестве .result по .readAsArrayBuffer(/* Blob or File object */)

Смежные вопросы