Dropbox选择器返回损坏的文件

Dropbox Chooser returns corrupted file

本文关键字:文件 损坏 返回 选择器 Dropbox      更新时间:2023-09-26

在这里张贴,因为我没有收到回复在dropbox论坛。Dropbox论坛帖子

几个月前,我实现了dropbox的选择器,并得到了一切工作正常。然后大约一个星期前,我遇到了一个问题。pdf文件可以打开,但包含空白页和。docx文件根本打不开(。rtf和。txt文件打开很好)

不管怎样,我开始挖掘,结果是xhr。返回的responseText短字节数(在pdf文件中大约短4%)

我已经看了一下字节和文件的开始和结束是正确的(不同的版本有相同的问题):

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

在控制台中,"文件大小"answers"标题大小"的值是相同的,但"缓冲区大小",responseText,它更小…

为什么dropbox返回所有的文件内容?

我认为问题是你正在阅读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'
});