التعامل مع الـFirebase Storage عن طريق الـUnity

شرح رفع وتنزيل الملفات للفايربيس ستورج من خلال اليونيتي

اصال الغامديمنذ 5 سنوات

 

السلام عليكم ورحمة الله

بمقالي الثالث حول التعامل مع الفايربيس من خلال اليونيتي بيكون ان شاء الله عن خدمة الكلاود ستورج Cloud Storage من الفايربيس وكيف بإمكاننا نرفع لها ونحمل منها الملفات من خلال اليونيتي.

المقال الأول كان بخصوص ربط الفايربيس باليونيتي.

https://3alam.pro/asalalghamdi/articles/setup-firebase-with-unity

المقال الثاني للتعامل مع قاعدة بيانات الفايربيس.

https://3alam.pro/asalalghamdi/articles/firebase-database-with-unity

بالأول نثبت الفايربيس على مشروع اليونيتي عن طريق ارفاق SDK وملف Google Service.

بنفس خطوات التثبيت بالمقال الأول راح ننفذها ولكن ارفقوا ملف SDK الخاص بالإستورج (FirebaseStorage). اذا سبق لنا التثبيت فمجرد ندرج ملف SDK.

بعد التثبيت ننشئ سكربت C# جديد ونبدأ نكتب فيه اكوادنا..

*للتسهيل راح تلاقوا بأخر المقال رابط قيت هب لسكربت فيه كامل الاكواد الي راح اوضحها.

نحتاج نعرِّف اوبجكت من FirebaseStorage لنوصل للكلاسات الخاصة بالستورج بالـ SDK

بعد كذا احنا بحاجة تعريف الريفرينس reference الي يدلنا على مكان وجود الستورج

الرابط انسخوه من مشروع الفايربيس داخل الستورج

 

بعد ما صار عندنا المتغير الريفرينس الي يوصلنا للستورج نبدأ الان بإرسال الملفات، في عندنا امرين مسؤولة للإرسال الأولى PutBytesAsync() وهي ترسل لنا البايت للملف بمعنى انا الملف عندي راح احوله الى array من bytes واعطيه للميثود PutBytesAsync().

الميثود الثانية PutFileAsync() وهي تأخذ الباث للملف الي يدلنا على مكان وجود الملف بداخل الجهاز.

عشان نستعمل أي ميثود خاصة بالإرسال نأخذ متغير الريفرينس storage_ref ونلحقه بميثود .Child() الي تعين لنا اسم الملف بالستورج، بعدها ميثود الإرسال ممكن نستعمل PutBytesAsync() ونتبعها بـContinueWith().

*ملاحظة: اسم الملف نكتبه مع امتداد الملف، الامتداد الي نكتبه من خلال الكود هو الي راح يتحدد مثلا لو كانت الصورة الموجودة عندنا بالجهاز بإمتداد .png وعينا امتدادها بالكود .jpg فراح تتغير امتداد الصورة بالستورج لما تترسل.

بالكود الصورة مخزنة بمتغير image نلاحظ بالأول حولناها لمتغير file_bytes كـ array من نوع بايت وبعدين عيناها كباراميتر بداخل PutBytesAsync().

*معلومة خاصة بمثال الكود عندي: متغير image بالكود من نوع Texture2D انشأته public من اول السكربت وارفقت له الصورة من خلال اليونيتي ايديتور وعشان احوله لنوع بايت استعملت ميثود EncodeToPNG()، لكن احرصوا نوع الصورة المرفقة باليونيتي تكون Sprite ممكن تغيروه من اعدادات الصورة نفسها.

هنا الصورة بعد ما أُرسِلت من اليونيتي..

التايب الخاص بالصورة بالستورج نلاحظ انه application/octet-stream لكن ما تشيلوا همه اذا حملتوا الصورة عالجهاز راح تنزل بالامتداد الطبيعي .jpg ، هيا تظهر بهذا الشكل لأننا ما عينا الـ metadata الخاصة بالملف وقت ارسلناه.

*معلومة: ملف الـ metadata هو ملف فيه معلومات لوصف ملف محدد، مثلا لو عندنا صورة فمعلومات الميتاداتا الخاصة لها بيكون مثل الاسم، النوع، تاريخ النشر والتعديل، حجم الملف ومعلومات إضافية.

https://whatis.techtarget.com/definition/metadata

هذي بيانات الميتاداتا الخاصة بالصورة الي رفعتها بالكود..

*معلومة اخرى: الملفات من نوع application/octet-stream هي ملفات باينري ما تشتغل الا على التطبيقات

https://kb.iu.edu/d/agtj

 وهذا السبب الي يخليها ما تظهر بالويب كمعاينة بالستورج مو مثل لو عملنا تحميل لصورة من الستورج بشكل يدوي، راح تظهر كمعاينة

بإمكاننا نغير من بيانات الميتاداتا بالكود وقت نرسل الملفات، لو حابين نغير التايب للملف نعرِّف اوبجكت من كلاس MetadataChange() ومن خلاله نوصل لـ ContentType ونعينه

وعشان نرسله مع الملف نرفقه كباراميتر بميثود الارسال سواء PutBytesAsync() او PutFileAsync().

لمعلومات أكثر عن التعامل مع ملف الـ metadata بالفايربيس

https://firebase.google.com/docs/storage/unity/file-metadata

اذا كنا حابين نرسل الملف من خلال الباث بإستعمال ميثود PutFileAsync(). فالباراميتر للميثود بيكون نص string لموقع الملف الي حابين نرفعه.

كمثال انا عندي صورة على سطح المكتب بجهازي فاخذت الباث الخاص فيها وارفقتها للميثود

تقريبا هذا كل ما يتعلق بإرسال الملفات، وبالنسبة لاختلاف نوع الملف سواء كان صورة او ملف txt او أي صيغة فالستورج ما تفرق معاه ومافي طريقة مختلفة بالإرسال المهم نحدد امتداد الملف الصحيح وراح يرسل تمام.

هنا المرجع الخاص بالإرسال من دكيومنت الفايربيس

https://firebase.google.com/docs/storage/unity/upload-files

*بس ملاحظة بسيطة: بالمرجع حاطين طريقة لاسترجاع الرابط الخاص بالملف بعد رفعه على الستورج، للأسف الطريقة الي بالدوكيومنت ما تضبط باليونيتي أضن الدكيومنت يحتاج تحديث بخصوصها. ولكن راح أوضح الطريقة لأخذ الرابط.

كل ملف اترفع للستورج له رابط URL خاص بإمكاننا نستعمله لنوصل للملف ونحمله مباشرة من المتصفح او ممكن نحمله عاليونيتي باستخدام كلاسات UnityWebRequest او WWW.

ميثود GetDownloadUrlAsync() ترجع لنا الرابط الي أنشئ للملف بوقت رفعنا عالستورج. نعيد استعمال الريفرينس للملف الي رفعناه ونضيف له الميثود.

*ملاحظة: بالكود نوع التاسك من كلاس Uri راح يظهر لنا أخطاء بأنه غير معرف فارفقوا بأول السكربت

using System;.

معلومة جدا مهمة، استعمال اوامر الإرسال تشتغل بطريقة متوازية Parallel بالكود، بمعنى ان امر الارسال يحدث وباقي الكود يستمر بالتنفيذ ما يتوقف او ينتظر وهذي نقطة جيدة اكيد لكن ان كان باقي اكوادنا تعتمد على انتظار تحميل الملف للستورج فهنا راح تصير لنا إشكالية.

كمثال لو عندي مستخدم رفع ملف صورة وحبيت اظهر له الرابط الخاص بالصورة ليقدر ينسخه وكتبت الكود بالشكل ذا..

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

فالحل الممكن لها ان أي كود معتمد على انتهاء الرفع نحطه بعد اكتمال التاسك. ونفس الموضوع بيكون لأوامر تنزيل الملفات.

بداخل الستورج بإمكاننا نعمل مجلدات ليكون مقسم ومرتب أكثر، قبل اسم الملف نضيف اسم المجلد بشرطة مائلة مثل صيغة كتابتنا للباث

"FolderName/FileName.xxx"

 مثلا لو انا حابه اعمل لكل مستخدم مجلد خاص يحتوي الملفات الي يشاركها بالتطبيق راح اعمل

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

نجي الآن لتحميل الملفات من الستورج عاليونيتي، الجزء هذا مرا بسيط مافي تفاصيل كثيرة..

عشان نحمل الملف من الستورج نحتاج متغير ريفرينس يشير الى الملف وبعدها نستعمل أوامر التحميل.

عندنا أكثر من طريقة لتنزيل الملف مثل الرفع، فممكن نحمل البايت للملف على مساحة تخزينية مؤقتة باستعمال ميثود GetBytesAsync() او ننزل الملف على باث معين بالجهاز مثل مجلد الصور باستعمال ميثود GetFileAsync().

إذا كنا حابين ننزل البايت للملف فأول شيء نحتاج نحدد الحجم المسموح للملفات لتنزيلها بالتطبيق. نعرف متغير يمثل عدد البايت ونستخدمه كبراميتر لميثود GetBytesAsync().

متغير maxAllowedSize هو الي يمثل اقصى حجم للملف، بالكود محدد 1 ميجابايت كأقصى حد بإمكانكم تزيدوا الجحم أكثر. متغير file_bytes هو الملف الي حملناه كـ bytes فنحتاج نحول الملف من البايت الى الصيغة الي يتناسب معها.

اذا حبينا ننزل الملف على الجهاز باستعمال ميثود GetFileAsync()، فنحدد المجلد الي راح نحمل فيه الملف مع اسم الملف بالامتداد

بالكود اخترت الباث لسطح المكتب واعطيت اسم للملف مع الامتداد الصحيح للصورة، مهم يكون الامتداد نفسه.

هذي كانت اهم امرين لتحميل الملفات، هنا الرابط المرجعي 

https://firebase.google.com/docs/storage/unity/download-files

واخر امر برمجي بمقال الستورج هو لحذف أي ملف بعد رفعه باستعمال ميثود DeleteAsync(). مجرد اعطي الريفرينس للملف واستعمل الامر راح يحذف لي الملف

وبالختام هذا رابط القيت الهب اذا حابين تستعملوا الاكواد الي وضحتها بالمقال 

https://github.com/AsalAlghamdi/firebase-storage-methods/blob/master/FBStorageScript.cs

 

شكرا لوقتكم بالقراءة أتمنى المقال كان مفيد وواضح، أي أسئلة او مشاكل تصير معكم اكتبوا لي بالكومنتات او تواصلوا معي على حسابي بتويتر دائما متواجدة @asalgham

 

بالتوفيق للجميع..

 

كلمات دليلية: c# firebase storage unity
0
إعجاب
1749
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !