通过 Dropbox API 上传的文件内容不一致

Posted

技术标签:

【中文标题】通过 Dropbox API 上传的文件内容不一致【英文标题】:Inconsistent file contents on uploading through Dropbox API 【发布时间】:2015-03-12 12:37:11 【问题描述】:

我正在使用Dropbox Core API 通过 chrome 扩展程序上传和下载文件。当我上传带有扩展名 .txt、.js、.json 或 .c 的文本文件时,文件会成功上传,但是当我上传带有扩展名 .pdf、.jpg 等(媒体文件)的文件时,内容会损坏或不存在,尽管文件大小不为零,有时甚至比原始文件还要大。这显然意味着读取的数据也在写入,但我想我读取或写入数据的方式存在一些问题。代码贴在下面供参考。

$(document).on("click", "#id_submit",uploadProcess);

function uploadProcess()

    var file = $("#upload_file")[0].files[0];
    console.log(file);

    if (!file)
        alert ("No file selected to upload.");
        return false;
    

    var reader = new FileReader();
    //reader.readAsText(file, "UTF-8");
    reader.readAsBinaryString(file);
    reader.onload = function (evt) 
        uploadFile(file.name, evt.target.result, file.size, file.type);
        //console.log(evt.target.result);
        var control = $("#upload_file");
        control.replaceWith( control = control.clone( true ));
    



//function to upload file to folder
function uploadFile(filepath,data,contentLength,contentType)
    var url = "https://api-content.dropbox.com/1/files_put/auto/"+filepath;
    var headers = 
        Authorization: 'Bearer ' + getAccessToken(),
        contentLength: contentLength
    
    var args = 
        url: url,
        headers: headers,
        crossDomain: true,
        crossOrigin: true,
        type: 'PUT',
        contentType: contentType,
        data : data,
        dataType: 'json',
        success: function(data)
        
            console.log(data);
        ,
        error: function(jqXHR)
        
            console.log(jqXHR);
        
    ;
    $.ajax(args);

【问题讨论】:

您总是将 contentType 设置为“text/plain”,这对于您提到的文本文件很好,但不适用于其他文件,请将其替换为您发送给函数的 contentType 变量 @juvian 对不起,我在这里发布了旧代码,我已经更正了,现在我在阅读 file.type 后传递了内容类型。问题仍然存在。 尝试改用 readAsArrayBuffer。如果还是不行,尝试添加 text/plain 的 Accept header; charset=iso-8859-1 并将内容类型设置为文本/纯文本; charset=iso-8859-1 @juvian 也不起作用。修改后的代码发布在这里。 jsfiddle.net/x4Lrj67x 奇怪,请尝试向 Dropbox 支持发送电子邮件 【参考方案1】:

您实际上可以在 ajax 请求中传递一个文件(取决于浏览器支持)。只需传递 args 对象中的文件,还需要将 processDate 和 contentType 设置为 false 以防止 $.ajax 操作文件对象

var args = 
    ...
    contentType: false,
    data : file,
    processData: false,
    ...
;

【讨论】:

我知道我们可以在 ajax 请求中传递一个文件,但这与 dropbox api 规范不一致。 @bawejakunal 我没有看到任何不一致之处。你试过了吗?

以上是关于通过 Dropbox API 上传的文件内容不一致的主要内容,如果未能解决你的问题,请参考以下文章

Dropbox.Api 无法上传大文件

Dropbox 直接从浏览器上传文件

使用 REST API 的 Dropbox 差异/增量上传

从 python 脚本上传文件到我的 Dropbox

通过 Dropbox sdk 上传视频时出现错误 1001

Evernote 和 OneDrive 的文件选择器 API