【问题标题】:How to upload a file into a specific location in the Google Drive using the JS API?如何使用 JS API 将文件上传到 Google Drive 中的特定位置?
【发布时间】:2022-02-01 18:29:51
【问题描述】:

我正在使用googleapis 将不同的文件上传到 Google 云端硬盘。场景是:

  1. 用户通过我的 REST API 提供了一个文档及其信息(我使用的是 NodeJS)。
  2. REST API 创建将包含文档的目录(如果该目录尚不存在)。
  3. REST API 将文档上传到该目录。

驱动的结构是:

/root/documents/$type/$new_document

其中$type 是用户提供的字段之一,$new_document 是用户提供的文档。

我的连接方式:

oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });
drive_instance = google.drive({
  version: 'v3',
  auth: oauth2Client,
});

我想出了如何将文档上传到 Google Drive 的 root 文件夹:

}
try {
    const response = await drive.files.create({
      requestBody: {
        name: file.name,
        mimeType: file.mimetype,
      },
      media: {
        mimeType: file.mimetype,
        body: file.data,
      },
    });

    console.log(response.data);
} catch (error) {
    console.log(error.message);
}

我正在苦苦挣扎的是:

  1. 如果目录/root/documents/$type 不存在,如何创建它?
  2. 如何将$new_document上传到/root/documents/$type

对于第二个问题,我知道docs 提供了一个parents[] 选项,它将包含所有文件夹ID。但是,我怎样才能获得/root/documents/$type 的文件夹ID?有没有办法结合这些步骤(比如可能mkdir -p 用于目录或创建目录将返回目录的 ID)。

【问题讨论】:

    标签: javascript node.js google-drive-api


    【解决方案1】:

    1.通过drive.files.list() 方法尝试找到您需要的文件夹

    您需要设置过滤器。示例:

    在 requestBody 中添加 'q': "..." 以搜索您需要的内容

    使用"name = 'Some Folder Name'"按名称搜索

    使用"mimeType = 'application/vnd.google-apps.folder'" 仅搜索文件夹

    因此,通过and 合并:

    'q': "name = 'Some Folder Name' and mimeType = 'application/vnd.google-apps.folder'" 查找您选择的名称的所有文件夹

    const folderName = 'Some Folder Name'
    
    
    gapi.client.drive.files
                    .list({
                        'q': "name = 'Some Folder Name' and mimeType = 'application/vnd.google-apps.folder'",
                        'pageSize': 1000,
                        'fields': "files(id, name, parents)"
                    })
                    .then((response) => {
    
                        const files = response.result.files;
                        if (files.length > 0) {
                          handleSearchResult(files)
                        } else {
                          createFolder()
                        }
                        console.log(total / (1024*1024*1024))
                    });
    

    关于handleSearchResult()createFolder

    • 可能不止一个文件。因此,您可以找到必要的 root 获取 files[i].parents 。这就是我在'fields': "files(id, name, parents)" 中添加parents 的原因。 https://developers.google.com/drive/api/v3/reference/files
    • 您还可以添加搜索规则,例如'parents contain "..."'' https://developers.google.com/drive/api/v3/search-files
    • 如果搜索结果为 0 个文件,请自行创建文件夹。您可以逐步创建路径\目录。在驱动器根目录中创建第一个文件夹并记住id。之后创建第二个文件夹并添加 requestBody parentId 等于第一个文件夹 id。等等...顺便说一句,您可以使用几乎相同的逻辑进行搜索。

    2。必要时创建文件夹

    例子:

    // name = 'Folder Name', 
    // parents = ['some-parent1-id', 'some-parent2-id', ...]
    function createFolder(name, parents) {
                const fileMetadata = {
                    'name' : name,
                    'mimeType' : 'application/vnd.google-apps.folder',
                    'parents': parents
                };
                gapi.client.drive.files
                    .create({
                        resource: fileMetadata,
                    }).then((response) => {
                        switch(response.status){
                            case 200:
                                const file = response.result;
    
                                console.log('Created Folder Id: ' + file.id);
                                break;
                            default:
                                console.log('Error creating the folder, '+response);
                                break;
                        }
                    });
            }
    

    3.上传设置parents的文件

    你应该在requestBody中添加parents = ['id-of-folder']

    阅读更多Google Drive API - Files: create

    我希望它至少会有所帮助:) 继续努力!

    【讨论】:

    • 感谢您的回答。 gapi 是什么?我正在使用googleapis。我像这样导入它:const { google } = require('googleapis');.
    • 只是我用了另一种方式:developers.google.com/drive/api/v3/quickstart/js?hl=en_US。但也许使用googleapis 看起来更好)
    • 以你的方式做你做的事情:drive.files.list() 而不是我的 gapi.client.drive.files.list() 等等......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多