Я играл с несколькими библиотеками шифрования JS (CryptoJS, SJCL) и обнаружил проблемы, связанные с API-интерфейсами Blob/File и двоичными строками JavaScript.
Я понял, что шифрование даже не очень актуально, так что здесь очень упрощенный сценарий. Просто прочитайте файл при использовании readAsBinaryString, а затем создайте Blob:
>>> reader.result
"GIF89a����ÿÿÿÿÿÿ!þCreated with GIMP�,�������D�;"
>>> reader.result.length
56
>>> typeof reader.result
"string"
>>> blob = new Blob([reader.result], {type: "image/gif"})
Blob { size=64, type="image/gif", constructor=function(), more...}
Я создал JSFiddle, который будет в основном делать следующее: он просто читает любой произвольный файл, создает из него blob и выводит длину vs size: http://jsfiddle.net/6L82t/1/
Похоже, что при создании Blob из "двоичной (javascript) строки" что-то с кодировкой символов заканчивается результатом.
Если используется недвоичный файл, вы увидите, что длины Blob и исходной двоичной строки идентичны.
Итак, есть что-то, что происходит при попытке создать Blob/File из строки Javascript, не являющейся открытым текстом, и мне нужно, чтобы этого не произошло. Я думаю, что это может иметь какое-то отношение к тому, что строки JS - это UTF-16?
Здесь есть (возможно) связанная тема: API-интерфейс HTML5 читается как текстовый и двоичный
Нужно ли, возможно, взять дешифрованные результаты (UTF-16) и "преобразовать" их в UTF-8 перед тем, как поместить их в Blob/File?
Работая с кем-то из # html5 на Freenode, мы определили, что если вы сразу читаете ArrayBuffer, а затем создаете blob из этого, сначала используя Uint8Array, байты работают просто отлично. Вы можете увидеть скрипку, которая по существу делает это здесь: http://jsfiddle.net/GH7pS/4/
Проблема в том, что, по крайней мере, в моем сценарии, я получаю двоичную строку и хотел бы выяснить, как напрямую преобразовать ее в Blob, чтобы затем я мог использовать загрузку html5, чтобы позволить пользователю нажмите, чтобы загрузить blob напрямую.
Спасибо!