簡體   English   中英

JavaScript Google Drive API V3-將文件上傳到文件夾

[英]JavaScript Google Drive API V3 - Upload a file to a folder

我一直試圖將一個包含用戶電子郵件和名稱的簡單文本文件上傳到驅動器根目錄中的文件夾中。 我創建了文件夾,然后使用其ID將文件上傳到該文件夾​​。

除了未將配置文件添加到新文件夾之外,其他所有操作都正常。 它只是與新文件夾一起位於根目錄中。

我研究了許多與此相關的問題,並嘗試了幾乎所有問題的解決方案。 尤其是這個問題( 使用google-drive-api將文件插入到特定文件夾 )似乎是我的確切問題。 但是正如您所看到的,我實現了他的更改,但我仍然遇到相同的問題。

下面是執行此操作的函數。

/**
 * Creates the correct directory structure and a config file in the user's drive;
 */
function setupDrive(email, name) {
    // TODO create CSR folder and config file inside
    createFolder('CSR');
    uploadConfig(email, name);
    checkAuth();
}

這是createFolder()函數。

/**
 * Creates a folder with the given name in the drive;
 */
function createFolder(dirName) {
    var metadata = {
        'name' : dirName,
        'mimeType' : 'application/vnd.google-apps.folder'
    };

    var request = gapi.client.request({
        'path': '/drive/v3/files',
        'method': 'POST',
        'body': JSON.stringify(metadata)});
    request.execute();
}

這是uploadConfig()函數。

/**
 * Uploads a config file to the CSR folder with the given email and name;
 */
function uploadConfig(email, name) {    
    var request = gapi.client.request({
        'path': '/drive/v3/files',
        'method': 'GET',
        'q': 'name="CSR", trashed="false", mimeType="application/vnd.google-apps.folder"',
        'fields': "nextPageToken, files(id, name)"
    });

    request.execute(function (results) {
        var files = results.files;
        var csrID = '';
        if (files && files.length > 0) {
            csrID = files[0].id;
        }
        uploadFile('config', email + '\n' + name, 'plain', csrID);
    });
}

最后是uploadFile()函數。

/**
 * Uploads either a plain text file or a CSV file to the user's Google Drive in the CSR folder;
 */
function uploadFile(fileName, fileContent, mimeType, parentID) {
    console.log(parentID); //check that a parentID is being passed in
    var auth_token = gapi.auth.getToken().access_token;

    var metaType = '';
    var bodyType = '';
    if (mimeType == 'csv') {
        metaType = 'application/vnd.google-apps.spreadsheet';
        bodyType = 'text/csv\r\n\r\n';
    } else if (mimeType == 'plain') {
        metaType = 'text/plain\r\n\r\n';
        bodyType = 'text/plain\r\n\r\n';
    }

    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    var metadata = {
        'name': fileName,
        'mimeType': metaType,
        'parents':[{'id': parentID}]
    };  

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter + 'Content-Type: ' + bodyType +
        fileContent +
        close_delim;

    var request = gapi.client.request({ 
        'path': '/upload/drive/v3/files',
        'method': 'POST',
        'params': {'uploadType': 'multipart'},
        'headers': { 'Content-Type': 'multipart/form-data; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + auth_token, },
        'body': multipartRequestBody 
    })

    request.execute(function (file) {
        console.log("Wrote to file " + file.name + " id: " + file.id); 
        }); 
}

非常感謝您的幫助,對於這么多代碼我深表歉意!

編輯:當我通過REST V2進行所有操作時,我能夠使其工作。 但是,我仍然希望看到一個允許我使用V3的解決方案。

相關的SO帖子相比,我看不到您的代碼有任何錯誤。 它指出v2的過程與v3非常相似。 您已經將網址中的版本更改為v3,並根據v3更改了參數。 在該線程中還指出,請注意,在v3中,不再有parent集合。 相反,您可以通過使用孩子的ID進行files.get來獲取parents屬性。 理想情況下,您將使用fields參數將響應限制為僅父級。 這樣的SO答案也可能會有所幫助,其中OP僅使用parents: ['parentID']元數據中的parents: ['parentID']

在V3上運行良好

function createFile(){
const boundary = '-------314159265358979323846';
const delimiter = "\r\n--" + boundary + "\r\n";
const close_delim = "\r\n--" + boundary + "--";

var fileContent = 'It works :)';

var metadata = {
    'name': 'myFile',
    'mimeType': 'text/plain\r\n\r\n'
};

var multipartRequestBody = delimiter +  'Content-Type: application/json\r\n\r\n' + JSON.stringify(metadata) + delimiter + 'Content-Type: ' + 'text/plain\r\n\r\n' + fileContent + close_delim;

gapi.client.request({
    'path': '/upload/drive/v3/files',
    'method': 'POST',
    'params': {
        'uploadType': 'multipart'
    },
    'headers': {
        'Content-Type': 'multipart/related; boundary="' + boundary + '"'
    },
    'body': multipartRequestBody
}).then(function(response){
    console.log(response);
});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM