讨论
Google Drive API v3 :Create Folder
云驱动 API 比较
创建文件夹时的其他云盘API,包括 Box API 和 Dropbox API ,如果父文件夹中已存在同名文件夹,则两者都会返回冲突错误。
然而, Google Drive API 默认情况下允许创建同名文件夹。
问题
如果尝试在 Google Drive 父文件夹中创建同名文件夹,是否有办法返回冲突错误?
如果我首先使用 API 来按名称搜索文件夹,然后在不存在的情况下创建文件夹,那么这可能导致并行进程在按名称创建唯一文件夹时执行相同的任务,从而导致可能的竞争条件。
示例
Google Drive API 创建文件夹调用 curl
curl "https://www.googleapis.com/drive/v3/files" \
--request POST \
--verbose \
--write-out 'HTTPSTATUS:%{http_code}' \
--silent \
--header "authorization: Bearer [** ACCESS TOKEN **]" \
--header "cache-control: no-cache" \
--header "content-type: application/json; charset=utf-8" \
--header "Accept: application/json" \
--data '{ \
"mimeType":"application\/vnd.google-apps.folder", \
"name": "[** FOLDER NAME **]", \
"parents": ["root"] \
}'
每次调用都会在 Google Drive 父文件夹中创建一个新文件夹 唯一的文件夹 ID,但是,相同的文件夹名称 .我希望避免这种情况:Success [HTTP status: 200]
{
"kind": "drive#file",
"id": "1mpy2-TVeZDTL8vZ6fKHTyoGoFHX-18EN",
"name": "TEST",
"mimeType": "application/vnd.google-apps.folder"
}
...
Success [HTTP status: 200]
{
"kind": "drive#file",
"id": "1iqYnEWOVFcWO3jWX1IgIv2wxtGVYruQX",
"name": "TEST",
"mimeType": "application/vnd.google-apps.folder"
}
我感谢任何帮助获得单一调用方法返回 冲突错误 或 自动重命名 .
最佳答案
如果我的理解是正确的,这个答案怎么样?请将此视为几种可能的答案之一。
问题和解决方法:
在 Google Drive,所有文件和文件夹都由唯一 ID 管理。这样就可以在一个文件夹中创建同名的文件和文件夹。当使用 Drive API 时,它使用的 ID 不是文件名和文件夹名。因此,为了使用 Drive API 实现您的目标,需要搜索文件夹名称。而且,为了防止与异步处理创建相同的文件夹名称,需要进行独占处理。不幸的是,通过这种方式,仅使用简单的 curl 命令无法实现您的目标。
从上述情况来看,为了仅使用简单的 curl 命令实现您的目标,我想使用 Web Apps 作为 API 作为解决方法。 Web Apps 是由 Google Apps Script 创建的,它可以像 API 一样使用。由此,我认为您的目标可以通过这种解决方法实现。
用法:
要使用此解决方法,请执行以下流程。
在这种情况下,将显示登录屏幕。所以请登录谷歌。这样,脚本编辑器就打开了。
function doGet(e) {
var lock = LockService.getScriptLock();
if (lock.tryLock(10000)) {
var parent, folder;
if (e.parameter.parentId) {
parent = DriveApp.getFolderById(e.parameter.parentId);
folder = parent.getFoldersByName(e.parameter.folderName);
} else {
parent = DriveApp.getRootFolder();
folder = DriveApp.getFoldersByName(e.parameter.folderName);
}
if (folder.hasNext()) {
lock.releaseLock();
var err = {error: "Same folder name is existing."};
return ContentService.createTextOutput(JSON.stringify(err)).setMimeType(ContentService.MimeType.JSON);
}
var folderId = parent.createFolder(e.parameter.folderName).getId();
lock.releaseLock();
var msg = {message: "Done.", folderId: folderId};
return ContentService.createTextOutput(JSON.stringify(msg)).setMimeType(ContentService.MimeType.JSON);
}
}
https://script.google.com/macros/s/###/exec
.curl -L \
-H "Authorization: Bearer ###" \
"https://script.google.com/macros/s/###/exec?parentId=###&folderName=###"
parentId
和 folderName
用作查询参数。 folderName
文件夹名称相同时存在于parentId
的文件夹中, {"error":"Same folder name is existing."}
被退回。 folderName
文件夹名称相同时不存在于 parentId
的文件夹中,创建新文件夹并{"message":"Done.","folderId":"### folder ID of created folder ###"}
被退回。 引用:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
关于google-apps-script - Google 云端硬盘 API : Create Folder: Allow conflict error if folder by name exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59184790/