Повреждение FileReader в FormData - PullRequest
1 голос
/ 27 августа 2011

Я создаю загрузчик файлов ajax, что возможно благодаря новому интерфейсу FormData .Это работает, если я использую исходный файл, но если я преобразую файл в двоичную строку, а затем в BLOB-объект, полученный файл будет поврежден.Что я делаю не так?

<!DOCTYPE html>
<html>
  <body>
    <form method=post enctype=multipart/form-data id=form>
      <input id=file type=file name=file>
      <button id=1>1</button>
      <button id=2>2</button>
    </form>
    <script>
      var d = document;

      function $(id) { return d.getElementById(id); };

      function xhr(fd) {
        var x = new XMLHttpRequest();
        x.open('post', '/', true);
        x.send(fd);
      };

      $(1).addEventListener('click', function(e) {
          e.preventDefault();
          var file = $('file').files[0];
          var fd = new FormData();
          fd.append('file', file);
          xhr(fd);
        }, false
      );

      $(2).addEventListener('click', function(e) {
          e.preventDefault();
          var file = $('file').files[0];
          var fr = new FileReader();
          fr.onload = function(e) {
            var bb = new (window.BlobBuilder ||
              window.MozBlobBuilder || window.WebKitBlobBuilder)()
            bb.append(e.target.result);
            var b = bb.getBlob(file.type);
            var fd = new FormData();
            fd.append('file', b);
            xhr(fd);
          };
          fr.readAsBinaryString(file);
        }, false
      );
    </script>
  </body>
</html>

Blob BlobBuilder FileReader FormData

отредактировановключить ссылки

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Я получил его в Firefox / Chrome, преобразовав строку в Uint8Array :

var result = e.target.result;
var l = result.length
var ui8a = new Uint8Array(l)
for (var i = 0; i < l; i++)
  ui8a[i] = result.charCodeAt(i);
bb.append(ui8a.buffer)
0 голосов
/ 27 августа 2011

Я не знаком с большинством этих объектов, но заметил, что вы ссылаетесь на file.type в функции fr.onload вашего второго прослушивателя событий. Находится ли в этой точке file? Разве вы не должны использовать e вместо этого?

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