在 Box 中更改文件夹所有权

Change folder ownership in Box

我们有两个用户,UserA 和 UserB。我想把UserB的所有文件和文件夹转移到UserA。

我们正在使用协作 API 来执行此任务。但是出现以下错误

{"type":"error","status":404,"code":"not_found","context_info":{"errors":[{"reason":"invalid_parameter","name":"role","message":"Invalid value 'Owner'. 'role' with value 'Owner' not found"}]},"help_url":"http://developers.box.com/docs/#errors","message":"Not Found","request_id":"304354248562a743910984"}

当我将 "owner" 以外的任何内容作为请求中的角色传递时,我得到了有效响应。我不知道 "owner" 角色有什么问题。

这是请求

POST https://api.box.com/2.0/collaborations/ HTTP/1.1 
As-User: 254598270 
Authorization: Bearer UPSUE228kXGuDBGzy07G5fGxIrDL1QDj 
Content-Type: text/plain; charset=utf-8 
Host: api.box.com 
Content-Length: 108 
Expect: 100-continue 
Accept-Encoding: gzip, deflate
{"item":{"id":"5092905410","type":"folder"},"accessible_by":{"id":"254608030","type":"user"},"role":"owner"}

我认为文档可能有误。考虑到协作的工作方式,在协作中指定 "owner" 角色并没有多大意义。

但是,move user's folder 端点可能正是您要寻找的。它允许您将一个用户的整个根文件夹移动到另一个用户的帐户中。下面是一个 cURL 请求示例:

curl https://api.box.com/2.0/users/USER_ID/folders/FOLDER_ID \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -d '{"owned_by": {"id": "USER_ID"}}' \
    -X PUT

请注意,目前仅支持根文件夹(即文件夹 ID 0)。幸运的是,看起来这就是您要移动的文件夹。

所缺少的只是您必须先将他们添加为编辑者,然后才能将他们设为所有者。

如果你关注https://developer.box.com/guides/folders/single/change-owner/

您会发现转移所有权实际上并不需要移动文件夹。这是一个非常简单的两(或三)步过程:

  1. 将新用户添加为角色 EDITOR
  2. 的协作者
  3. 立即将该协作更新为 OWNER
  4. 的角色

就是这样。 (可选)您现在可以删除已从所有者降级为编辑者的原始所有者的协作。

这是我使用 Python SDK 的示例:

bc = box.BoxClient()  # This is my own client wrapper
owner = bc.get_user(old_owner.lastname)
user_client = bc.get_user_client(owner.id)  # Get a user_client for the owner
src_folder = user_client.folder(FOLDER_ID)

target = bc.get_user('new_owner.lastname')

new_collab = src_folder.collaborate(target, CollaborationRole.EDITOR)
updated_collaboration = new_collab.update_info(CollaborationRole.OWNER)

# Now we can remove the original owner as collaborator:
for collab in src_folder.get_collaborations():
    target = collab.accessible_by
    if target.id == owner.id:
        collab.delete()