Dropbox Chooser возвращает поврежденный файл

размещаю здесь, потому что я не получил ответа на форумах Dropbox. сообщение на форуме Dropbox

Несколько месяцев назад я реализовал средство выбора Dropbox, и все заработало нормально. Затем около недели назад я столкнулся с проблемой, когда файлы .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);

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

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


person thedanisaur    schedule 20.08.2015    source источник
comment
Что касается форума Dropbox, в следующий раз попробуйте опубликовать сообщение о разработке API. Я перенес твой пост туда. dropboxforum. com/hc/en-us/community/posts/   -  person user94559    schedule 20.08.2015


Ответы (1)


Я думаю, проблема в том, что вы читаете из поля responseText XMLHttpRequest вместо 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'
});
person user94559    schedule 20.08.2015
comment
Переход на .response не дает никакой разницы - person thedanisaur; 20.08.2015
comment
Ваши предложения по-прежнему не решают проблему. Кроме того, теперь длина байта возвращается как неопределенная. - person thedanisaur; 26.08.2015
comment
Я обновил свой ответ полным рабочим кодом, включая веб-сайт, где вы можете проверить его самостоятельно. Я тестировал в Хроме. Если у вас не работает, сообщите нам, какой браузер вы используете. - person user94559; 27.08.2015