尝试将大文件上传到Google云端硬盘

时间:2019-10-15 19:25:53

标签: javascript google-drive-api

我正在尝试将一个大文件上传到Google云端硬盘,尤其是150MB的.mov文件。我尝试了50MB的.mp4,它大约有25%的时间可以工作。

function uploadFile(fileInput, infomark, type, index = 0, title = '') {
    var _index = index;
    var file = fileInput.files[_index]
    var fileLength = fileInput.files.length
    document.getElementById('divUploadText').textContent = `Uploading File ${index + 1}/${fileLength}`

    insertFile(file).then(function (uploadedfile) {
        if (title === '' || title === null) {
            title = uploadedfile.title.replace(/[.*+?^${}()|[\]\\]/g, '')
        }
        var googleID = uploadedfile.id
    })
}

async function insertFile(fileData) {
    try {
        const boundary = '-------314159265358979323846';
        const delimiter = "\r\n--" + boundary + "\r\n";
        const close_delim = "\r\n--" + boundary + "--";

        let base64Data = null;
        await readFile(fileData).then(function (e) {
            base64Data = e;
        });

        var contentType = fileData.type || 'application/octet-stream';
        var metadata = {
            'title': fileData.name,
            'mimeType': contentType,
            "parents": [{
                "id": 'root'
            }]
        };

        var multipartRequestBody =
            delimiter +
            'Content-Type: application/json\r\n\r\n' +
            JSON.stringify(metadata) +
            delimiter +
            'Content-Type: ' + contentType + '\r\n' +
            'Content-Transfer-Encoding: base64\r\n' +
            '\r\n' +
            base64Data +
            close_delim;

        const fulfilledValue = await gapi.client.request({
            'path': '/upload/drive/v2/files',
            'method': 'POST',
            'params': {
                'uploadType': 'multipart'
            },
            'headers': {
                'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
            },
            'body': multipartRequestBody

        });
        let result = await fulfilledValue.result;

        var requestPermissions = gapi.client.request({
            'path': '/drive/v3/files/' + result.id + '/permissions',
            'method': 'POST',
            'headers': {
                'Content-Type': 'application/json'
            },
            'body': {
                'role': 'reader',
                'type': 'anyone'
            }
        });

        requestPermissions.execute(function (resp) {
            console.log(resp);
        });

        return result;

    } catch (rejectedValue) {
        console.log("Failed to insert file into folder", rejectedValue);
    }
}

async function readFile(file) {
    let reader = new FileReader();
    reader.readAsBinaryString(file);
    return await new Promise(resolve => {
        reader.onload = e => {
            resolve(btoa(e.target.result));
        };

    });
}

我尝试遍历代码,并且一切正常,但是在没有断点的情况下放开它会带来未定义的问题。任何帮助将不胜感激。

0 个答案:

没有答案