Python:如何使用folderId将文件上传到Google云端硬盘中的特定文件夹

时间:2014-11-06 15:40:50

标签: python google-drive-api

因此,我正在尝试将文件上传到用户指定的特定Google云端硬盘文件夹。以下是我尝试过的代码。我得到了folderID,我尝试将文件发布到该文件夹​​但是我收到404 Not Found错误。

def post_file(self, files_to_send, config = {}):
  if config:
    if type(config) is str:
      config = literal_eval(config)
    path_id = config.get('path')
  for file_to_send in files_to_send:
    filename = file_to_send.name.split('/')[-1]
    status = self.call.post('https://www.googleapis.com/upload/drive/v2/files?uploadType=media/' + str(path_id) + "/children")

使用Drive API文档中的界面,我能够获取具有相同folderID的数据,但我无法发布(即使使用界面)。 Files_to_send是一个列表,其中包含我需要上传到特定文件夹的所有文件,config包含文件夹路径。

我需要帮助了解我做错了什么。我已经阅读了文档并查看了其他答案,但我还没有找到解决方案。如果我没有指定文件夹ID,则会将虚拟文件发布到我的驱动器,但它不会上传我想要的文件,并且在指定folderID时它根本不会上传任何内容。

基本上,我需要帮助插入来自Google云端硬盘中特定文件夹的文件。

谢谢!

5 个答案:

答案 0 :(得分:3)

我相信您应该发送包含parents字段的元数据JSON。 类似的东西:

{
    "parents" : [path_id]
}

您可以在此处试用此API:https://developers.google.com/drive/v2/reference/files/insert

答案 1 :(得分:1)

解决此问题需要两个步骤:

  1. 获取文件夹ID:

    folder_list = self.drive.ListFile({'q': "trashed=false"}).GetList()
        for folder in folder_list:
             print 'folder title: %s, id: %s' % (folder['title'], folder['id'])
    
  2. 找到所需文件夹的ID后,使用此功能:

    def upload_file_to_specific_folder(self, folder_id, file_name):
        file_metadata = {'title': file_name, "parents": [{"id": folder_id, "kind": "drive#childList"}]}
        folder = self.drive.CreateFile(file_metadata)
        folder.SetContentFile(file_name) #The contents of the file
        folder.Upload()
    

答案 2 :(得分:0)

我将文件放在特定文件夹中的方法是在元数据中传递以下信息。

此处<someFolderID>信息可以检索为: 1.去谷歌驱动器 2.选择文件夹 3.观察地址栏,它在https://drive.google.com/drive/folders/

之后会有一些值
{
"parents":[
"id": "<someFolderID>",
"kind": "drive#file"
]
}

答案 3 :(得分:0)

在第3版中,只需更新file_metadata即可:

file_metadata = {'name': 'exmample_file.pdf', "parents": ["ID_OF_THE_FOLDER"]}

答案 4 :(得分:0)

用于混凝土样品

...
from googleapiclient import discovery
from apiclient.http import MediaFileUpload
...
drive_service = discovery.build('drive', 'v3', credentials=creds)
...
def uploadFile(filename, filepath, mimetype, folderid):
    file_metadata = {'name': filename,
                     "parents": [folderid]
                     }
    media = MediaFileUpload(filepath,
                            mimetype=mimetype)
    file = drive_service.files().create(body=file_metadata,
                                        media_body=media,
                                        fields='id').execute()
    print('File ID: %s' % file.get('id'))
  
#sample to use it:
filename = 'cible.png'
filepath = 'path/to/your/cible.png'
mimetype = 'image/png'
folderid = 'your folder id' #ex:'1tQ63546ñlkmulSaZtz5yeU5YTSFMRRnJz'
uploadFile(filename, filepath, mimetype, folderid)