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

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

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

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

نشر الأذونات

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

في المقابل، إذا اكتسب ملف الدور 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;
        }
    }
}