javascript 如何使用JS API将文件上传到Google云端硬盘中的特定位置?

xam8gpfp  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(117)

我正在使用googleapis将不同的文件上传到Google云端硬盘。
1.用户通过我的REST API(我使用的是NodeJS)提供文档和信息。

  1. REST API创建将包含文档的目录(如果该目录尚不存在)。
  2. REST API将文档上载到该目录。
    驱动器的结构为:
/root/documents/$type/$new_document

其中$type是用户提供的字段之一,$new_document是用户提供的文档。
我的连接方式:

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

我想出了如何将文档上传到谷歌驱动器的文件夹:

}
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不存在,如何创建它?
1.如何将$new_document上传到/root/documents/$type
对于第二个问题,我知道docs提供了一个包含所有文件夹ID的parents[]选项。但是,我如何才能获得/root/documents/$type的文件夹ID?是否有某种方法可以合并这些步骤(例如,mkdir -p用于目录或创建目录将返回目录的ID)。

q43xntqr

q43xntqr1#

    • 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

  • 它可能超过1个文件。所以你可以找到必要的根获得files[i].parents。这就是为什么我添加了parents'fields': "files(id, name, 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中阅读更多内容
我希望它至少能帮上一点忙:)坚持下去!

mrphzbgm

mrphzbgm2#

您可以使用以下方法上载文件夹中的文件夹
1.你应该有你想在其中存储新文件夹的文件夹的id**(可以使用nodejs API或者通过打开文件夹并查看url中last /之后的字符来提取)**
1.使用为google驱动器中的文件夹保留的特殊mimetype**(application/vnd.google-apps.folder)**

  • 以你为榜样 *
drive.files.create({
  requestBody:{
    name:"SomeFolder",
    mimeType:"application/vnd.google-apps.folder"
  },(error,folder)=>{
    console.log(folder.data.id);
    drive.files.create:({
       requestBody:{
       name:"SomeFolderInsideAFolder",
       mimeType:"application/vnd.google-apps.folder"
       },
       parents:[folder.data.id]
    })
 })
})

你甚至可以很容易地创建一个递归上传文件夹功能相结合的文件上传和文件夹上传,可以上传整个文件夹

相关问题