مشاركة الملفات والمجلدات ومساحات التخزين

ترتبط كل ملف ومجلد ومساحة تخزين سحابي مشتركة على Google Drive بموارد permissions. يحدِّد كل مورد الإذن لملف type (user أو group أو domain أو anyone) وrole (owner أو organizer أو fileOrganizer أو writer أو commenter أو reader) معيّن. على سبيل المثال، قد يحتوي الملف على إذن يمنح مستخدمًا معيّنًا (type=user) إذن الوصول للقراءة فقط (role=reader)، في حين يمنح إذن آخر أعضاء مجموعة معيّنة (type=group) إمكانية إضافة kommentiert إلى ملف (role=commenter).

للحصول على قائمة كاملة بالأدوار والعمليات المسموح بها لكل دور، يُرجى الرجوع إلى الأدوار والأذونات.

سيناريوهات لمشاركة مراجع Drive

هناك خمسة أنواع مختلفة من سيناريوهات المشاركة:

  1. لمشاركة ملف في "ملفاتي"، يجب أن يكون لدى المستخدم إذن role=writer أو role=owner.

  2. لمشاركة مجلد في "ملفاتي"، يجب أن يكون لدى المستخدم إذن role=writer أو role=owner.

    • وإذا تم ضبط القيمة المنطقية writersCanShare على false للملف، يجب أن يملك المستخدم قيمة role=owner الأكثر تساهلاً.

    • لا يُسمح بالوصول المؤقت (الذي يخضع لتاريخ ووقت انتهاء صلاحية) إلى مجلدات "ملفاتي" باستخدام role=writer. لمزيد من المعلومات، اطّلِع على تحديد تاريخ انتهاء صلاحية للحد من الوصول إلى الملفات.

  3. لمشاركة ملف في مساحة تخزين سحابي مشتركة، يجب أن يكون لدى المستخدم إذن الوصول role=writer أو role=fileOrganizer أو role=organizer.

    • لا ينطبق الإعداد writersCanShare على العناصر في مساحات التخزين السحابي المشتركة. ويتم التعامل معه كما لو كان مضبوطًا دائمًا على true.
  4. لمشاركة مجلد في مساحة تخزين سحابي مشتركة، يجب أن يكون لدى المستخدم role=organizer.

    • في حال ضبط التقييد sharingFoldersRequiresOrganizerPermission على مساحة تخزين سحابي مشتركة على false، يمكن للمستخدمين الذين لديهم role=fileOrganizer مشاركة المجلدات في مساحة التخزين السحابي المشتركة هذه.
  5. لإدارة العضوية في مساحة التخزين السحابي المشتركة، يجب أن يكون لدى المستخدم role=organizer. يمكن فقط للمستخدمين والمجموعات أن يكونوا أعضاء في مساحات التخزين السحابي المشتركة.

ضبط تاريخ انتهاء صلاحية لتقييد الوصول إلى الملفات

عند العمل مع مستخدمين في مشروع حسّاس، قد تريد تقييد وصولهم إلى ملفات معيّنة في Drive بعد فترة زمنية. بالنسبة إلى الملفات في "ملفاتي"، يمكنك تحديد تاريخ انتهاء صلاحية لتحديد الحد الأقصى لعدد المستخدمين الذين يمكنهم الوصول إلى هذا الملف أو إزالتهم.

لتحديد تاريخ انتهاء الصلاحية:

  • استخدِم طريقة create() على المورد permissions واضبط الحقل expirationTime (بالإضافة إلى الحقول المطلوبة الأخرى). لمزيد من المعلومات، يُرجى الاطّلاع على إنشاء إذن.

  • استخدِم طريقة update() على مورد permissions واضبط الحقل expirationTime (بالإضافة إلى الحقول الأخرى المطلوبة). لمزيد من المعلومات، يُرجى الاطّلاع على تغيير الأذونات.

يشير الحقل expirationTime إلى وقت انتهاء صلاحية الإذن باستخدام RFC 3339 date-time. تنطبق القيود التالية على مُدد انتهاء الصلاحية:

  • ولا يمكن ضبطها إلا على أذونات المستخدمين والمجموعات.
  • يجب أن يكون الوقت في المستقبل.
  • لا يمكن أن يكون الوقت في المستقبل أكثر من سنة.

لمزيد من المعلومات عن تاريخ انتهاء الصلاحية، اطّلِع على المقالات التالية:

نشر الأذونات

تنتشر قوائم الأذونات للمجلد نزولاً، وتكتسب جميع الملفات والمجلدات الفرعية الأذونات من المجلد الرئيسي. عند تغيير الأذونات أو التسلسل الهرمي، يحدث النشر بشكل متكرر في جميع المجلدات المضمّنة. على سبيل المثال، في حال توفّر ملف في مجلد ونقل هذا المجلد إلى مجلد آخر، يتم نشر الأذونات في المجلد الجديد إلى الملف. إذا منح المجلد الجديد مستخدم الملف دورًا جديدًا، مثل "كاتب"، سيتم إلغاء دوره القديم.

في المقابل، إذا اكتسب ملف الدور role=writer من مجلد، وتم نقله إلى مجلد آخر يقدّم دور "قارئ"، يكتسب الملف الآن الدور role=reader.

لا يمكن إزالة الأذونات المكتسَبة من ملف أو مجلد في مساحة تخزين سحابي مشتركة. بدلاً من ذلك، يجب تعديل هذه الأذونات في الحساب الرئيسي المباشر أو غير المباشر الذي اكتسبت منه هذه الأذونات. يمكن إزالة الأذونات المكتسَبة من العناصر ضمن "ملفاتي" أو "تمت مشاركتها معي".

في المقابل، يمكن إلغاء الأذونات المكتسَبة في ملف أو مجلد في "ملفاتي" على Drive. وبالتالي، إذا اكتسب ملف الإذن role=writer من مجلد "ملفاتي" في Drive، يمكنك ضبط role=reader على الملف لخفض مستوى الإذن.

الإمكانات

لا يحدّد مرجع permissions في نهاية المطاف قدرة المستخدم الحالي على تنفيذ إجراءات على ملف أو مجلد. بدلاً من ذلك، يحتوي المورد files على مجموعة من حقول capabilities المنطقية المستخدمة للإشارة إلى ما إذا كان يمكن تنفيذ إجراء على ملف أو مجلد. تضبط Google Drive API هذه الحقول استنادًا إلى مرجع أذونات المستخدم الحالي المرتبط بالملف أو المجلد.

على سبيل المثال، عندما يسجّل أليكس الدخول إلى تطبيقك ويحاول مشاركة ملف، يتم التحقق من دور أليكس ولمعرفة ما إذا كان لديه أذونات في الملف. إذا كان الدور يسمح له بمشاركة ملف، يتم ملء capabilities المرتبط بالملف، مثل canShare، بالنسبة إلى الدور. إذا أراد "علي" مشاركة الملف، يتحقّق تطبيقك من capabilities للتأكّد من ضبط canShare على true.

للحصول على مثال على استرداد الملف capabilities، اطّلِع على التحقّق من أذونات المستخدم.

إنشاء إذن

يجب ملء الحقلين التاليين عند إنشاء إذن:

  • type: يحدِّد الرمز type نطاق الإذن (user أو group أو domain أو anyone). وينطبق الإذن الذي يتضمّن type=user على مستخدم معيّن، في حين ينطبق الإذن الذي يتضمّن type=domain على جميع المستخدمين في نطاق معيّن.

  • role: يحدِّد حقل role العمليات التي يمكن أن ينفّذها type. على سبيل المثال، يمنح الإذن الذي يتضمّن type=user وrole=reader مستخدمًا معيّنًا إذن وصول للقراءة فقط إلى الملف أو المجلد. أو يسمح الإذن الذي يتضمّن type=domain وrole=commenter لجميع المستخدمين في النطاق بإضافة تعليقات إلى ملف. للاطّلاع على قائمة كاملة بالأدوار والعمليات التي يسمح بها كل منها، يُرجى الرجوع إلى الأدوار والأذونات.

عند إنشاء إذن يتضمّن type=user أو type=group، يجب أيضًا تقديم emailAddress لربط مستخدم أو مجموعة معيّنين بالإذن.

عند إنشاء إذن حيث يكون type=domain، يجب أيضًا تقديم domain لربط نطاق معيّن بال الإذن.

لإنشاء إذن:

  1. استخدِم الطريقة create() مع مَعلمة المسار fileId للملف أو المجلد المرتبط.
  2. في نص الطلب، حدِّد type وrole.
  3. إذا كان الخيار type=user أو type=group، أدخِل emailAddress. إذا كان type=domain، قدِّم domain.

عرض مثال

يوضّح نموذج الرمز البرمجي التالي كيفية إنشاء إذن. تعرِض الاستجابة مثيلًا لمصدر Permission، بما في ذلك permissionId المحدَّد.

طلب

POST https://www.googleapis.com/drive/v3/files/FILE_ID/permissions
{
  "requests": [
    {
        "type": "user",
        "role": "commenter",
        "emailAddress": "alex@altostrat.com"
    }
  ]
}

الردّ

{
    "kind": "drive#permission",
    "id": "PERMISSION_ID",
    "type": "user",
    "role": "commenter"
}

استخدام شرائح الجمهور المستهدَفة

الجماهير المستهدفة هي مجموعات من الأشخاص، مثل الأقسام أو الفِرق، يمكنك اقتراحها للمستخدمين لمشاركة العناصر معهم. يمكنك تشجيع المستخدمين على مشاركة العناصر مع جمهور أكثر تحديدًا أو محدودًا بدلاً من مشاركة المؤسسة بأكملها. يمكن أن تساعدك الجماهير المستهدَفة في تحسين أمان بياناتك وخصوصيتها، وتسهيل مشاركة المستخدمين لها بشكل مناسب. لمزيد من المعلومات، اطّلِع على لمحة عن شرائح الجماهير المستهدفة .

لاستخدام شرائح الجمهور المستهدَفة:

  1. في "وحدة تحكّم المشرف في Google"، انتقِل إلى رمز القائمة > الدليل > الجماهير المستهدَفة.

    الانتقال إلى "الجماهير المستهدفة"

    يجب تسجيل الدخول باستخدام حساب يمتلك امتيازات المشرف المتميّز لتنفيذ هذه المهمة.

  2. في قائمة الجماهير المستهدَفة، انقر على اسم الجمهور المستهدَف. لإنشاء جمهور مستهدف، اطّلِع على مقالة إنشاء جمهور مستهدف.

  3. انسخ المعرّف الفريد من عنوان URL للجمهور المستهدَف: https://admin.google.com/ac/targetaudiences/ID.

  4. أنشئ إذنًا باستخدام type=domain، واضبط الحقل domain على ID.audience.googledomains.com.

للاطّلاع على كيفية تفاعل المستخدِمين مع شرائح الجمهور المستهدَفة، اطّلِع على تجربة المستخدِم للمشاركة باستخدام رابط .

استرداد جميع الأذونات لملف أو مجلد أو مساحة تخزين سحابي مشتركة

استخدِم طريقة list() في مورد permissions لاسترداد جميع الأذونات لملف أو مجلد أو مساحة تخزين سحابي مشترَكة.

عرض مثال

يوضّح نموذج الرمز البرمجي التالي كيفية الحصول على جميع الأذونات. يعرض الردّ قائمة بالأذونات.

الطلب

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions

الاستجابة

{
  "kind": "drive#permissionList",
  "permissions": [
    {
      "id": "PERMISSION_ID",
      "type": "user",
      "kind": "drive#permission",
      "role": "commenter"
    }
  ]
}

التحقّق من أذونات المستخدم

عندما يفتح تطبيقك ملفًا، من المفترض أن يتحقّق من إمكانات الملف وأن يعرض واجهة المستخدم لتعكس أذونات المستخدم الحالي. على سبيل المثال، إذا لم يكن لدى المستخدم إذن canComment على الملف، يجب إيقاف إمكانية التعليق في واجهة المستخدم.

لمزيد من المعلومات عن capabilities، اطّلِع على قسم الإمكانات .

للتحقّق من الإمكانات، يمكنك استدعاء طريقة get() في مورد files باستخدام مَعلمة fileId المسار ومَعلمة fields التي تم ضبطها على الحقل capabilities. للمزيد من المعلومات حول عرض الحقول باستخدام المَعلمة fields، يُرجى الاطّلاع على عرض حقول محدّدة لملف.

عرض مثال

يوضّح نموذج الرمز البرمجي التالي كيفية التحقّق من أذونات المستخدم. يعرض الردّ قائمة بالصلاحيات التي يمتلكها المستخدم في الملف. تتوافق كل قدرة مع إجراء دقيق يمكن للمستخدم اتّخاذه. لا يتم ملء بعض الحقول إلا للعناصر في مساحات التخزين السحابي المشتركة.

الطلب

GET https://www.googleapis.com/drive/v3/files/FILE_ID?fields=capabilities

الردّ

{
  "capabilities": {
    "canAcceptOwnership": false,
    "canAddChildren": false,
    "canAddMyDriveParent": false,
    "canChangeCopyRequiresWriterPermission": true,
    "canChangeSecurityUpdateEnabled": false,
    "canComment": true,
    "canCopy": true,
    "canDelete": true,
    "canDownload": true,
    "canEdit": true,
    "canListChildren": false,
    "canModifyContent": true,
    "canModifyContentRestriction": true,
    "canModifyLabels": true,
    "canMoveChildrenWithinDrive": false,
    "canMoveItemOutOfDrive": true,
    "canMoveItemWithinDrive": true,
    "canReadLabels": true,
    "canReadRevisions": true,
    "canRemoveChildren": false,
    "canRemoveMyDriveParent": true,
    "canRename": true,
    "canShare": true,
    "canTrash": true,
    "canUntrash": true
  }
}

تحديد مصدر الأدوار لملفات مساحة التخزين السحابي المشتركة والمجلدات فيها

لتغيير الدور على ملف أو مجلد، عليك معرفة مصدر الدور. بالنسبة إلى مساحات التخزين السحابي المشتركة، يمكن أن يستند مصدر الدور إلى العضوية في مساحة التخزين السحابي المشتركة أو الدور في مجلد أو الدور في ملف.

لتحديد مصدر الدور لمساحة التخزين السحابي المشتركة أو العناصر ضمن مساحة التخزين السحابي هذه، يمكنك استدعاء طريقة get() في المورد permissions باستخدام مَعلمتَي المسار fileId وpermissionId وضبط المَعلمة fields على الحقل permissionDetails.

للعثور على permissionId، استخدِم الإجراء list() على المَعلمةpermissions مع مَعلمة المسارfileId. لجلب حقل permissionDetails في طلب list، اضبط المَعلمة fields على permissions/permissionDetails.

يسرد هذا الحقل جميع أذونات الملفات المكتسَبة والمُباشرة للمستخدم أو المجموعة أو النطاق.

عرض مثال

يوضّح نموذج الرمز البرمجي التالي كيفية تحديد مصدر الدور. يعرض الردّ permissionDetails لمصدر permissions. يقدّم الحقل inheritedFrom معرّف العنصر الذي يتم اكتساب الإذن منه.

طلب

GET https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID?fields=permissionDetails&supportsAllDrives=true

الردّ

{
  "permissionDetails": [
    {
      "permissionType": "member",
      "role": "commenter",
      "inheritedFrom": "INHERITED_FROM_ID",
      "inherited": true
    },
    {
      "permissionType": "file",
      "role": "writer",
      "inherited": false
    }
  ]
}

تغيير الأذونات

لتغيير الأذونات في ملف أو مجلد، يمكنك تغيير الدور المخصّص:

  1. استخدِم طريقة update() في مورد permissions مع ضبط مَعلمة مسار permissionId على إذن التغيير وضبط مَعلمة مسار fileId على الملف أو المجلد أو مساحة التخزين السحابي المشتركة المرتبطة. للعثور على permissionId، استخدِم الإجراء list() على المَعلمةpermissions مع مَعلمة المسارfileId.

  2. في الطلب، حدِّد role الجديد.

يمكنك منح أذونات على ملفات أو مجلدات فردية في مساحة تخزين سحابي مشتركة حتى إذا كان المستخدم أو المجموعة عضوًا فيها. على سبيل المثال، لدى "علي" role=commenter كجزء من عضويته في مساحة تخزين سحابي مشتركة. ومع ذلك، يمكن لتطبيقك منح "أليكس" role=writer إذن الوصول إلى ملف في مساحة تخزين سحابي مشتركة. في هذه الحالة، بما أنّ الدور الجديد أكثر تساهلاً من الدور الممنوح من خلال العضوية، يصبح الإذن الجديد هو الدور الفعال للملف أو المجلد.

عرض مثال

يعرض نموذج الرمز البرمجي التالي كيفية تغيير الأذونات على ملف أو مجلد من معلِّق إلى كاتب. تعرِض الاستجابة مثيلًا لمصدر permissions.

الطلب

PATCH https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID
{
  "requests": [
    {
        "role": "writer"
    }
  ]
}

الاستجابة

{
  "kind": "drive#permission",
  "id": "PERMISSION_ID",
  "type": "user",
  "role": "writer"
}

إدراج اقتراحات الوصول في انتظار المراجعة وحلّها

اقتراح الوصول هو اقتراح يقدّمه مقدّم الطلب إلى جهة الموافقة لمنح مستلِم الإذن بالوصول إلى عنصر في Drive.

يمكن لجهة الموافقة مراجعة جميع اقتراحات الوصول التي لم يتم حلّها فيملفّات Drive واتّخاذ إجراء بشأنها. وهذا يعني أنّه يمكنك تسريع عملية الموافقة من خلال إجراء طلب بحث آلي عن اقتراحات الوصول ثم حلّها. ويسمح أيضًا للموافق بالاطّلاع على الاقتراحات بشكل مجمّع.

توفّر واجهة برمجة تطبيقات Drive المورد accessproposals لكي تتمكّن من عرض اقتراحات الوصول المعلّقة وحلّها. تعمل طُرق ملف موارد accessproposals على الملفات والمجلدات والملفات ضمن ملف تخزين سحابي مشترَك، ولكن ليس على مساحة التخزين السحابي المشتركة.

تنطبق المصطلحات التالية على طلبات الوصول:

  • المُقدّم: المستخدم الذي يقدّم اقتراح الوصول إلى ملف في Drive
  • المستلِم: المستخدم الذي يتلقّى الأذونات الإضافية على ملف في حال منح اقتراح الوصول في كثير من الأحيان، يكون المستلِم هو نفسه العميل الذي подал الطلب، ولكن ليس دائمًا.
  • المنِح للموافقة: المستخدم المسؤول عن الموافقة (أو الرفض) على اقتراح الوصول ويعود ذلك عادةً إلى أنّه مالك للمستند أو لديه إمكانية مشاركته.

عرض طلبات الوصول المعلّقة

لعرض جميع طلبات الوصول المعلّقة في عنصر على Drive، استخدِم الأسلوب list() في المورد accessproposals وأدرِج مَعلمة المسار fileId.

يمكن للموافقين فقط في ملف إدراج الاقتراحات المعلّقة في ملف. المستخدم المانِح للموافقة هو مستخدم لديه إمكانية can_approve_access_proposals في الملف. إذا لم يكن مقدِّم الطلب مستخدمًا مانِحًا للموافقة، سيتم عرض قائمة فارغة. لمزيد من المعلومات عن capabilities، اطّلِع على قسم الإمكانات.

يتألّف جسم الاستجابة من عنصر AccessProposal يمثّل قائمة باقتراحات الوصول غير المحسّنة في الملف.

يتضمّن عنصر AccessProposal معلومات عن كل اقتراح، مثل المُقدّم والمستقبل والرسالة التي أضافها المُقدّم. ويتضمّن أيضًا عنصر AccessProposalRoleAndView يجمع role المقترَح لمقدّم الطلب مع view. بما أنّ role حقل متكرّر، يمكن أن تتوفّر قيم متعدّدة لكلّ اقتراح. على سبيل المثال، قد يحتوي الاقتراح على عنصر AccessProposalRoleAndView من role=reader و view=published، بالإضافة إلى عنصر AccessProposalRoleAndView إضافي يحتوي على قيمة role=writer فقط. لمزيد من المعلومات، يُرجى الاطّلاع على الملفات الشخصية.

نقْل مَعلمات طلب البحث التالية لتخصيص تقسيم الصفحات لاقتراحات الوصول أو فلترتها:

  • pageToken: رمز مميّز للصفحة، تم تلقّيه من طلب قائمة سابق قدِّم هذا الرمز المميّز لاسترداد الصفحة اللاحقة.

  • pageSize: الحد الأقصى لعدد اقتراحات الوصول التي سيتم عرضها في كل صفحة

حلّ اقتراحات الوصول في انتظار المراجعة

لحلّ جميع اقتراحات الوصول المعلّقة في أحد عناصر Drive، يمكنك استدعاء الأسلوب resolve() في المورد accessproposals وتضمين مَعلمتَي مسارfileId وproposalId.

تتضمّن الطريقة resolve() مَعلمة طلب بحث action تشير إلى الإجراء الذي يجب اتّخاذه بشأن الاقتراح. يتتبّع العنصر Action تغيير حالة الاقتراح لنعرف ما إذا كان سيتم قبوله أو رفضه.

تتضمّن طريقة resolve() أيضًا مَعلمات طلب البحث الاختيارية role و view. الأدوار الوحيدة المتوافقة هي writer وcommenter وreader. إذا لم يتم تحديد الدور، سيتم ضبطه تلقائيًا على "reader". تتيح لك مَعلمة طلب بحث اختيارية إضافية send_notification إرسال إشعار عبر البريد الإلكتروني إلى العميل عند قبول الاقتراح أو رفضه.

كما هو الحال مع طريقة list()، يجب أن تتوفّر للمستخدمين الذين يجرون الاقتراح، ميزة can_approve_access_proposals في الملف. لمزيد من المعلومات عن capabilities، اطّلِع على قسم الإمكانات.

يتم حلّ الاقتراحات باستخدام الأنماط نفسها المدرَجة ضمن سيناريوهات مشاركة موارد Drive. إذا كانت هناك اقتراحات متعدّدة للمستخدِم نفسه، ولكن بأدوار مختلفة، ينطبق ما يلي:

  • إذا تم قبول اقتراح ورفض اقتراح آخر، ينطبق الدور المقبول على عنصر Drive.
  • في حال قبول العرضَين في الوقت نفسه، يتم تطبيق الاقتراح الحاصل على إذن أعلى (على سبيل المثال، role=writer مقابل role=reader). ستتم إزالة اقتراح الوصول الآخر من العنصر.

بعد إرسال اقتراح إلى طريقة resolve()، يكتمل إجراء المشاركة. لم يعُد يتم عرض AccessProposal من خلال الطريقة list() . بعد قبول الاقتراح، على المستخدم استخدام مجموعة permissions لتعديل الأذونات في ملف أو مجلد. لمزيد من المعلومات، يُرجى الاطّلاع على القسم تغيير الأذونات.

إلغاء إذن الوصول إلى ملف أو مجلد

لإلغاء إذن الوصول إلى ملف أو مجلد، يمكنك استدعاء الأسلوب delete() في مورد permissions مع ضبط مَعلمات مسار fileId وpermissionId لحذف الإذن.

بالنسبة إلى العناصر في "ملفاتي"، من الممكن حذف إذن حاصل عليه من مصدر آخر. يؤدي حذف إذن موروث إلى إلغاء إمكانية الوصول إلى العنصر والعناصر الفرعية، إن توفّرت.

بالنسبة إلى العناصر في مساحة تخزين سحابي مشتركة، لا يمكن إلغاء الأذونات المكتسَبة. قم بتحديث الإذن أو إبطاله على الملف أو المجلد الرئيسي بدلاً من ذلك.

يتم استخدام الطريقة delete() أيضًا لحذف الأذونات التي يتم تطبيقها مباشرةً على ملف أو مجلد مساحة تخزين سحابي مشتركة.

عرض مثال

يوضّح نموذج الرمز البرمجي التالي كيفية إبطال إذن الوصول عن طريق حذف permissionId. إذا كانت الاستجابة ناجحة، يكون نص الاستجابة فارغًا. لتأكيد إزالة الإذن، استخدِم الطريقة list() في مورد permissions مع مَعلمة المسار fileId.

طلب

DELETE https://www.googleapis.com/drive/v3/files/FILE_ID/permissions/PERMISSION_ID

نقل ملكية الملف إلى حساب آخر على Google Workspace في المؤسسة نفسها

يمكن نقل ملكية الملفات الحالية في "ملفاتي" من حساب Google Workspace إلى حساب آخر في المؤسسة نفسها. تمتلك المؤسسة التي تمتلك مساحة درايفية مشتركة الملفات داخلها. لذلك، لا تتوفر إمكانية نقل الملكية للملفات والمجلدات في مساحات التخزين السحابي المشتركة. يمكن لمنظمي مساحة التخزين السحابي المشتركة نقل العناصر من مساحة التخزين السحابي المشتركة هذه إلى "ملفاتي" الخاصة بهم، ما يؤدي بدوره إلى نقل الملكية إليهم.

لنقل ملكية ملف في "ملفاتي"، نفِّذ أحد الإجراءات التالية:

  • أنشئ إذن ملف يمنح مستخدمًا معيّنًا (type=user) إذن وصول مالك (role=owner).

  • عدِّل إذن ملف حالي باستخدام role=owner وانقل الملكية إلى المستخدم المحدّد (transferOwnership=true).

نقل ملكية ملف من حساب مستهلك إلى آخر

ويمكن نقل ملكية الملفات بين حساب مستهلك إلى آخر. ومع ذلك، لا ينقل Drive ملكية ملف بين حسابَي مستهلكَين إلى أن يوافق المالك المحتمل على النقل صراحةً. لنقل ملكية ملف من حساب مستهلك إلى حساب آخر:

  1. يبدأ المالك الحالي عملية نقل الملكية من خلال إنشاء أو تعديل إذن الملف الخاص بالمالك المحتمل. يجب أن يتضمّن الإذن الإعدادات التالية: role=writer وtype=user وpendingOwner=true. إذا كان المالك الحالي ينشئ إذنًا للمالك المحتمل، يتم إرسال إشعار عبر البريد الإلكتروني إلى المالك المحتمل يشير إلى أنّه تتم دعوة المالك المحتمل إلى تولي ملكية الملف.

  2. يقبل المالك المحتمل طلب نقل الملكية من خلال إنشاء إذن الملف أو تعديله. يجب أن يتضمّن الإذن الإعدادَين التاليَين: role=owner وtransferOwnership=true. إذا كان المالك المحتمل ينشئ إذنًا جديدًا، يتم إرسال إشعار عبر البريد الإلكتروني إلى المالك السابق للإشارة إلى أنّه تم نقل الملكية.

عند نقل ملف، يتم خفض دور المالك السابق إلى writer.

تغيير أذونات متعددة باستخدام طلبات مجمّعة

ننصحك بشدة باستخدام طلبات الحِزم لتعديل عدة أذونات.

في ما يلي مثال على إجراء تعديل على أذونات مجمَّعة باستخدام مكتبة عملاء.

Java

drive/snippets/drive_v3/src/main/java/ShareFile.java
import com.google.api.client.googleapis.batch.BatchRequest;
import com.google.api.client.googleapis.batch.json.JsonBatchCallback;
import com.google.api.client.googleapis.json.GoogleJsonError;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.Permission;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Class to demonstrate use-case of modify permissions. */
public class ShareFile {

  /**
   * Batch permission modification.
   * realFileId file Id.
   * realUser User Id.
   * realDomain Domain of the user ID.
   *
   * @return list of modified permissions if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static List<String> shareFile(String realFileId, String realUser, String realDomain)
      throws IOException {
        /* Load pre-authorized user credentials from the environment.
         TODO(developer) - See https://developers.google.com/identity for
         guides on implementing OAuth2 for your application.application*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    final List<String> ids = new ArrayList<String>();


    JsonBatchCallback<Permission> callback = new JsonBatchCallback<Permission>() {
      @Override
      public void onFailure(GoogleJsonError e,
                            HttpHeaders responseHeaders)
          throws IOException {
        // Handle error
        System.err.println(e.getMessage());
      }

      @Override
      public void onSuccess(Permission permission,
                            HttpHeaders responseHeaders)
          throws IOException {
        System.out.println("Permission ID: " + permission.getId());

        ids.add(permission.getId());

      }
    };
    BatchRequest batch = service.batch();
    Permission userPermission = new Permission()
        .setType("user")
        .setRole("writer");

    userPermission.setEmailAddress(realUser);
    try {
      service.permissions().create(realFileId, userPermission)
          .setFields("id")
          .queue(batch, callback);

      Permission domainPermission = new Permission()
          .setType("domain")
          .setRole("reader");

      domainPermission.setDomain(realDomain);

      service.permissions().create(realFileId, domainPermission)
          .setFields("id")
          .queue(batch, callback);

      batch.execute();

      return ids;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to modify permission: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/share_file.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def share_file(real_file_id, real_user, real_domain):
  """Batch permission modification.
  Args:
      real_file_id: file Id
      real_user: User ID
      real_domain: Domain of the user ID
  Prints modified permissions

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)
    ids = []
    file_id = real_file_id

    def callback(request_id, response, exception):
      if exception:
        # Handle error
        print(exception)
      else:
        print(f"Request_Id: {request_id}")
        print(f'Permission Id: {response.get("id")}')
        ids.append(response.get("id"))

    # pylint: disable=maybe-no-member
    batch = service.new_batch_http_request(callback=callback)
    user_permission = {
        "type": "user",
        "role": "writer",
        "emailAddress": "user@example.com",
    }
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=user_permission,
            fields="id",
        )
    )
    domain_permission = {
        "type": "domain",
        "role": "reader",
        "domain": "example.com",
    }
    domain_permission["domain"] = real_domain
    batch.add(
        service.permissions().create(
            fileId=file_id,
            body=domain_permission,
            fields="id",
        )
    )
    batch.execute()

  except HttpError as error:
    print(f"An error occurred: {error}")
    ids = None

  return ids


if __name__ == "__main__":
  share_file(
      real_file_id="1dUiRSoAQKkM3a4nTPeNQWgiuau1KdQ_l",
      real_user="gduser1@workspacesamples.dev",
      real_domain="workspacesamples.dev",
  )

Node.js

drive/snippets/drive_v3/file_snippets/share_file.js
/**
 * Batch permission modification
 * @param{string} fileId file ID
 * @param{string} targetUserEmail username
 * @param{string} targetDomainName domain
 * @return{list} permission id
 * */
async function shareFile(fileId, targetUserEmail, targetDomainName) {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const permissionIds = [];

  const permissions = [
    {
      type: 'user',
      role: 'writer',
      emailAddress: targetUserEmail, // 'user@partner.com',
    },
    {
      type: 'domain',
      role: 'writer',
      domain: targetDomainName, // 'example.com',
    },
  ];
  // Note: Client library does not currently support HTTP batch
  // requests. When possible, use batched requests when inserting
  // multiple permissions on the same item. For this sample,
  // permissions are inserted serially.
  for (const permission of permissions) {
    try {
      const result = await service.permissions.create({
        resource: permission,
        fileId: fileId,
        fields: 'id',
      });
      permissionIds.push(result.data.id);
      console.log(`Inserted permission id: ${result.data.id}`);
    } catch (err) {
      // TODO(developer): Handle failed permissions
      console.error(err);
    }
  }
  return permissionIds;
}

PHP

drive/snippets/drive_v3/src/DriveShareFile.php
use Google\Client;
use Google\Service\Drive;
function shareFile()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $realUser = readline("Enter user email address: ");
        $realDomain = readline("Enter domain name: ");
        $ids = array();
            $fileId = '1sTWaJ_j7PkjzaBWtNc3IzovK5hQf21FbOw9yLeeLPNQ';
            $fileId = $realFileId;
            $driveService->getClient()->setUseBatch(true);
            try {
                $batch = $driveService->createBatch();

                $userPermission = new Drive\Permission(array(
                    'type' => 'user',
                    'role' => 'writer',
                    'emailAddress' => 'user@example.com'
                ));
                $userPermission['emailAddress'] = $realUser;
                $request = $driveService->permissions->create(
                    $fileId, $userPermission, array('fields' => 'id'));
                $batch->add($request, 'user');
                $domainPermission = new Drive\Permission(array(
                    'type' => 'domain',
                    'role' => 'reader',
                    'domain' => 'example.com'
                ));
                $userPermission['domain'] = $realDomain;
                $request = $driveService->permissions->create(
                    $fileId, $domainPermission, array('fields' => 'id'));
                $batch->add($request, 'domain');
                $results = $batch->execute();

                foreach ($results as $result) {
                    if ($result instanceof Google_Service_Exception) {
                        // Handle error
                        printf($result);
                    } else {
                        printf("Permission ID: %s\n", $result->id);
                        array_push($ids, $result->id);
                    }
                }
            } finally {
                $driveService->getClient()->setUseBatch(false);
            }
            return $ids;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

NET.

drive/snippets/drive_v3/DriveV3Snippets/ShareFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Requests;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive modify permissions.
    public class ShareFile
    {
        /// <summary>
        /// Batch permission modification.
        /// </summary>
        /// <param name="realFileId">File id.</param>
        /// <param name="realUser">User id.</param>
        /// <param name="realDomain">Domain id.</param>
        /// <returns>list of modified permissions, null otherwise.</returns>
        public static IList<String> DriveShareFile(string realFileId, string realUser, string realDomain)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var ids = new List<String>();
                var batch = new BatchRequest(service);
                BatchRequest.OnResponse<Permission> callback = delegate(
                    Permission permission,
                    RequestError error,
                    int index,
                    HttpResponseMessage message)
                {
                    if (error != null)
                    {
                        // Handle error
                        Console.WriteLine(error.Message);
                    }
                    else
                    {
                        Console.WriteLine("Permission ID: " + permission.Id);
                    }
                };
                Permission userPermission = new Permission()
                {
                    Type = "user",
                    Role = "writer",
                    EmailAddress = realUser
                };

                var request = service.Permissions.Create(userPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);

                Permission domainPermission = new Permission()
                {
                    Type = "domain",
                    Role = "reader",
                    Domain = realDomain
                };
                request = service.Permissions.Create(domainPermission, realFileId);
                request.Fields = "id";
                batch.Queue(request, callback);
                var task = batch.ExecuteAsync();
                task.Wait();
                return ids;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}