我正在尝试使用 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()
自己设法解决了这个问题,结果证明这是一个相当简单的方法 - 这是处理复制单个文件的函数的代码。
#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()
您需要先复制文件,然后更新它,首先删除当前的父文件夹,然后添加新父文件夹的 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()
对于 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;
}