使用XMLHttpRequest对象响应创建文件

时间:2017-03-23 12:37:38

标签: xmlhttprequest blob

首先,如果我说的话没有任何意义,请允许我道歉。我在这里远离了我的舒适区,并且不知道我在做什么。随着那说......

我使用Google Drive File Picker library允许用户从他们的Google云端硬盘上传他们的简历。

function downloadGDriveFile(file) {
    if (file.downloadUrl) {
        var accessToken = gapi.auth.getToken().access_token;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', file.downloadUrl);
        xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
        xhr.onload = function () {
            var content = xhr.response;
            console.log(xhr);

            form_element = document.getElementById("new_guest_application");
            form_data = new FormData(form_element);
            new_file = new File([content], file.title, {type: file.mimeType});
            form_data.append('guest_application[curriculum_vitae]', new_file);
            console.log(new_file);

            var request = new XMLHttpRequest();
            request.open("POST", form_element.action);
            request.send(form_data);

        };
        xhr.onerror = function () {
            alert('Download failure.');
        };
        xhr.send();
    }
    else {
        alert('Unable to download file.');
    }
}

使用上面的代码,我接受所选的file对象并使用它以及相关的标头令牌来下载文件的content。这似乎按预期工作。

我的问题出现在尝试将所述内容转换为File以附加到表单并提交到我的服务器时。

上面的代码可以工作,只要服务器接受文件并相应地上传,但所述文件已损坏。我想象这是因为我对file = new File([content], file.title, {type: file.mimeType});行做错了,但我到目前为止还在我的舒适区之外,我甚至都不知道在哪里开始。

(作为一项规则,我不会做很多JavaScript,只能通过健康的复制/粘贴试用和错误来实现这一目标)

有人可以帮帮我吗?感谢。

1 个答案:

答案 0 :(得分:2)

xhr.response将返回一些格式,具体取决于xhr.responseType中定义的数据类型。 如果您携带二进制数据,并且responseType设置为文本类型,则您的数据将会损坏。

您可以在阅读回复之前尝试覆盖xhr.responseType

xhr.responseType = "arraybuffer";
var content = xhr.response;