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);

В конзолата стойностите "File size" и "Header size" са еднакви, но "Buffer size", responseText, той е по-малък...

Защо 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. Предполагам, че това води до (неправилен) опит за интерпретиране на данните като текстови знаци.

РЕДАКТИРАНЕ: Вие също трябва да промените arrayBuffer на arraybuffer, за да получите действително ArrayBuffer обратно. След това трябва да проверите полето byteLength, за да получите действителния брой байтове, съдържащи се в ArrayBuffer.

Имайте предвид, че за да използвате типа отговор arraybuffer, ще трябва да преминете към използване на асинхронен XMLHttpRequest. (Премахнете последния параметър false до xhr.open или променете стойността му на true.)

РЕДАКТИРАНЕ 2:

Работещ (за мен) пример е на 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
Актуализирах отговора си с пълен работещ код, включително уебсайт, където можете да го тествате сами. Тествах в Chrome. Ако не работи за вас, моля, уведомете ни кой браузър използвате. - person user94559; 27.08.2015