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

ترتبط كل ملف ومجلد ومساحة تخزين سحابي مشتركة في 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 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;
        }
    }
}