使用 Drive API v3 复制文件不会更改标题或位置

问题描述 投票:0回答:3

我正在尝试使用 Drive API v3 来复制文件。尽管我成功获得了要创建的文件的副本,但复制的文件的标题和位置都没有像我希望的那样更改。查看在线可用的代码片段,我不确定我的代码有什么问题,因此我们将不胜感激。

def copy(service, file_id, dest_id): #Drive service, id of file to be copied, id of destination folder
    service.files().copy(
        fileId=file_id,
        supportsAllDrives=True,
        body = {
                'title':'copiedFile',
                'parents' : [ {'kind':"drive#fileLink",
                                'id': dest_id}],
                }
        ).execute()
python python-3.x google-api google-drive-api
3个回答
2
投票

自己设法解决了这个问题,结果证明这是一个相当简单的方法 - 这是处理复制单个文件的函数的代码。

#Handles copying of a file.
#If no new destination (parent) is provided, it is copied
#into the same location the original file was located.

def copy(service, fileID, parents=None):
    mimetype = service.files().get(fileId=fileID, fields='mimeType', supportsAllDrives=True).execute()['mimeType']
    if mimetype == 'application/vnd.google-apps.folder': #If the provided file id points to a folder
        #Code to handle copying a folder
    else:
        file_metadata = {}
        if parents is not None: #If custom destination is specified, add it to the file metadata
            file_metadata['parents'] = [parents]

        #Copy the file
        file = service.files().copy(
            fileId=fileID,
            body=file_metadata,
            fields='id, name', #Can be whatever fields you want, I just like having access to the resulting file id & name
            supportsAllDrives=True).execute()

1
投票

您需要先复制文件,然后更新它,首先删除当前的父文件夹,然后添加新父文件夹的 ID。这是一个可以解决问题的片段:

copy = (
    service.files()
    .copy(
        fileId=file_id,
        body={"title": "copiedFile"},
    )
    .execute()
)

service.files().update(
    fileId=copy.get("id"),
    addParents=dest_id,
    removeParents=copy.get("parents"),
    fields="id, parents",
).execute()

0
投票

对于 2024 年使用 Google Drive v3 API 的其他人来说,答案是使用“名称”参数而不是“标题”:

function copyFile(fileId, parentId, newFileName) {
    const copiedFile = Drive.Files.copy({
        name: newFileName,
        parents: [{
            id: parentId,
        }]
    }, fileId, {
        supportsAllDrives: true
    });
    return copiedFile.id;
}
© www.soinside.com 2019 - 2024. All rights reserved.