2015-08-20 2 views
0

размещение здесь, потому что я не получил ответа на форумах Dropbox. dropbox forum postDropbox Chooser возвращает поврежденный файл

Несколько месяцев назад я внедрил выборщик и решил, что все работает нормально. Затем около недели назад я столкнулся с проблемой, в которой будут открываться файлы .pdf, но содержат пустые страницы, а файлы .docx вообще не будут открываться (файлы с расширением .rtf и .txt просто прекрасны)

В любом случае я начал копать и получается, что возвращаемый xhr.responseText короткий число байтов (приблизительно 4% в pdf-файлах)

Я взглянул на байты, и начало и конец файла верны (различные версии имеют один и тот же вопрос):

% PDF-1.5
...
%% EOF

Вот соответствующий код:

var options = { 
    success: function(files) 
    { 
     var xhr = new XMLHttpRequest(); 
     xhr.open("GET", files[0].link, false); 
     xhr.responseType = 'arrayBuffer'; 
     xhr.onreadystatechange = function(oEvent) 
     { 
      if (xhr.readyState === 4 && xhr.status === 200) 
      { 
        var buffer = xhr.responseText; 
        console.log('File size: ' + files[0].bytes + 
           ' | Buffer size: ' + buffer.length + 
           ' | Header size: ' + xhr.getResponseHeader('Content-Length')); 
      } 
     } 
     xhr.setRequestHeader("User-Agent", navigator.userAgent); 
     try 
     { 
      xhr.send(null); 
     } 
     catch (err) 
     { 
      alert(err); 
     } 
    }, 
    linkType: "direct", // or "preview" 
    multiselect: false, // or true 
}; 

Dropbox.choose(options); 

В консоли «размер файла» и «размер заголовка» значения одинаковы, но «Размер буфера», то responseText, он меньше ...

Почему dropbox возвращает все содержимое файла?

+0

На стороне форума Dropbox, в следующий раз попробуйте опубликовать в разделе «Разработка API». Я переехал туда. https://www.dropboxforum.com/hc/en-us/community/posts/204965035-Dropbox-Chooser-return-size-differs-from-responseText – smarx

ответ

0

Я думаю, проблема в том, что вы читаете поле XMLHttpRequestresponseText вместо response. Мое предположение было бы в том, что это приводит к (неправильному) попытке интерпретировать данные как текстовые символы.

EDIT: Кроме того, необходимо изменить arrayBuffer к arraybuffer на самом деле получить ArrayBuffer обратно. Затем вам нужно проверить поле byteLength, чтобы получить фактическое количество байтов, содержащихся в ArrayBuffer.

Обратите внимание, что для использования типа ответа arraybuffer вам необходимо переключиться на использование асинхронного XMLHttpRequest. (Отбросьте false последний параметр в xhr.open или изменить его значение true.)

edit2:

рабочей (для меня) пример на https://downloadtest.site44.com. Код выглядит следующим образом:

Dropbox.choose({ 
    success: function (files) { 
     var xhr = new XMLHttpRequest(); 
     xhr.open('GET', files[0].link); 
     xhr.responseType = 'arraybuffer'; 
     xhr.onreadystatechange = function (oEvent) { 
      if (xhr.readyState === 4 && xhr.status === 200) { 
       var buffer = xhr.response; 
       console.log('File size: ' + files[0].bytes + 
        ' | Buffer size: ' + buffer.byteLength + 
        ' | Header size: ' + xhr.getResponseHeader('Content-Length')); 
      } 
     }; 
     xhr.send(); 
    }, 

    linkType: 'direct' 
}); 
+0

Изменение на .response не дает разницы – thedanisaur

+0

См. мое редактирование. Есть еще несколько ошибок. – smarx

+0

Ваши предложения по-прежнему не устраняют проблему. Кроме того, теперь длина байта возвращается как неопределенная. – thedanisaur

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