کار با فایلها و پوشهها - Unity
در این مستند شما با همهی قابلیتهای سرویس فایل از طریق SDK یونیتی آشنا خواهید شد.
پیشنیازها
- در صورتی که با سرویس فایل آشنایی ندارید، به معرفی سرویس فایل مراجعه کنید.
- در صورتی که هنوز در پنل توسعهدهنده خود تنظیمات لازم برای سرویس فایل خود را انجام ندادهاید، به تنظیمات پنل مراجعه کنید.
- در صورتی که هنوز SDK یونیتی را راهاندازی نکردهاید، به راهاندازی SDK بکتوری در یونیتی مراجعه کنید.
در ادامه فرض شده که کاربر شما لاگین کردهاست.
آپلود فایل
نکته: دقت کنید که با توجه به ظرفیت کم حافظه در گوشیهای موبایل، آپلود فایل به کمک sdk بکتوری فعلا تنها برای فایلهای کمحجم در دسترس است و در غیر این صورت، خطر crash به خاطر کمبود memory وجود دارد. همچنین، عمل آپلود محدود به زنده بودن اپلیکیشن است؛ یعنی، در صورتی که اپلیکیشن در میانهی آپلود kill شود، عمل آپلود ناموفق خواهد بود.
برای آنکه بتوانید یک فایل را از روی دستگاه موبایل کاربر به سرور بکتوری آپلود کنید، کدی مانند زیر لازم است:
BacktoryFile backtoryFile = new BacktoryFile ("<FILE-PATH-ON-DEVICE>");
backtoryFile.UploadInBackground ("<UPLOAD-PATH>", true, (response) => {
if (response.Successful) {
string filePathOnServer = response.Body;
Debug.Log("Upload was successful. File path on server (url) is " + filePathOnServer);
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع UploadInBackground دریافت میکند، به ترتیب به صورت زیر است:
- uploadPath: آدرس پوشهی فایل نهایی آپلود شده را در سمت سرور مشخص میکند.
- replace: در صورتی که فایلی همنام و هممسیر با فایل آپلود شده وجود داشته باشد، مشخص میکند که فایل جایگزین بشود یا خیر. در صورتی که مقدارش برابر true باشد، عمل جایگزینی انجام میگیرد؛ اما در صورتی که مقدارش false باشد، عمل با خطا مواجه میشود.
- callback: با به پایان رسیدن عمل آپلود صدا زده شده و پاسخ سرور را برمیگرداند.
نکته: در صورتی که پوشههای درخواست شده وجود نداشته باشد، سرویس آپلود به صورت پیشفرض این پوشهها را خواهد ساخت.
در صورتی که عمل آپلود با موفقیت انجام شود، response.Body برابر مسیر فایل آپلود شده خواهد بود. دقت کنید که این مسیر با رشتهی آرگومان uploadPath که شما به عنوان ورودی پاس دادهاید، ممکن است در شرایطی فرق کند! در واقع، اگر رشتهی uploadPath صرفا شامل حروف کوچک یا بزرگ انگلیسی و یا اعداد باشد، عینا همان پوشهی مشخص شده در response.Body خواهد بود. اما در صورتی که شامل کارکترهای ویژه، کارکتر فاصله، حروف فارسی و … باشد، response.Body رشتهی کاملا متفاوتی خواهد بود. به عنوان مثال، فرض کنید داریم:
string filePathOnDevice = "file 1 .txt";
string uploadPath = "/path/to/";
یعنی، یک کارکتر فاصله قبل و بعد از حرف ۱ در نام فایل وجود داشته باشد. در این صورت، response.Body به صورت
"/path/to/file%201%20.txt"
خواهد بود. بنابراین، مهم است که به جای رشتهی uploadPath، رشتهی response.Body را به عنوان آدرس فایل روی سرور برای ارجاعهای بعدی نگه دارید.
تغییر نام فایل
برای آنکه بتوانید نام فایلی را که سمت سرور آپلود شده است، تغییر دهید، میبایست به صورت زیر عمل کنید:
BacktoryFile.RenameInBackground ("<URL>", "<NEW-NAME>", (response) => {
if (response.Successful) {
string renamedFilePath = response.Body;
Debug.Log("Rename was successful. New file url is " + renamedFilePath);
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع RenameInBackground دریافت میکند، به ترتیب به صورت زیر است:
- url: آدرس فایل را در سمت سرور مشخص میکند.
- newName: نام جدیدی که برای فایل انتخاب کردهایم، را مشخص میکند.
- callback: با به پایان رسیدن عمل تغییر نام صدا زده شده و پاسخ سرور را برمیگرداند.
در صورتی که عمل تغییر نام موفقیتآمیز باشد، response.Body برابر آدرس جدید فایل در سمت سرور خواهد بود. دقت کنید که علاوه بر اینکه مشابه قسمت قبل، کارکترهای ویژه همچون فاصله، & و … به صورت encode شده در پاسخ سرور ظاهر میشوند، رشتهی response.Body حاوی یک ویژگی مهم دیگر نیز هست؛ و آن اینکه نام مخزن شما در ابتدای url برگردانده شده وجود دارد!
به عنوان مثال، فرض کنید آرگومانهایی که به تابع تغییر نام پاس میدهیم، به صورت زیر هستند:
string url = "/path/to/file1.txt";
string newName = "newFile 1&.txt";
در صورتی که عملیات تغییر نام موفقیتآمیز باشد، response.Body برابر خواهد بود با
"/pegah/path/to/newFile%201%26.txt"
که pegah مثلا نام مخزن شماست! برای اینکه بتوانید به راحتی نام مخزن را از ابتدای این url ها که در جواب درخواست تغییر نام برگردانده میشوند، حذف کنید، کافیست تابع زیر را روی response.Body صدا بزنید:
string correctUrl = BacktoryFile.RemoveBucketNameFromRenameResponse (response.Body);
و برای ارجاعهای بعدی به فایل، رشتهی correctUrl را نگاه دارید.
حذف فایل/پوشه
برای آنکه یک فایل یا پوشه را در سمت سرور حذف کنید، متد زیر از sdk بکتوری به کمک شما میآید:
BacktoryFile.DeleteInBackground ("<URL>", true, (response) => {
if (response.Successful) {
Debug.Log("Delete was successful.");
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع DeleteInBackground دریافت میکند، به صورت زیر هستند:
- url: آدرس فایل یا پوشهای که میخواهید حذف شود.
- deleteContentsIfFolder: در صورتی که url آدرس یک پوشه است، مشخص میکند که محتویات آن هم پاک شود یا خیر.
- callback: با به پایان رسیدن عمل حذف صدا زده شده و پاسخ سرور را برمیگرداند.
اعمال دستهای بر روی فایلها
در قسمتهای قبل یاد گرفتیم که چگونه میتوان در sdk بکتوری تنها «یک» فایل را آپلود یا حذف کرد و یا تغییر نام داد. قابلیت دیگری که به کمک sdk وجود دارد، این است که همهی این کارها را، نه روی «یک» فایل، بلکه روی «دستهای» از فایلها انجام دهیم. در ادامه با نحوهی انجام این اعمال آشنا خواهید شد.
آپلود دستهای فایلها
برای آپلود فایلها به صورت دستهای کد زیر مورد استفاده قرار میگیرد:
new BacktoryFile.Bulk().UploadInBackground(fileAddresses, uploadPaths, replaces,
(response) => {
if (response.Successful) {
IList<string> filesPathsOnServer = response.Body;
for(int i = 0; i < filesPathsOnServer.Count; i++) {
Debug.Log(i + "'th file path on server: " + filesPathsOnServer[i]);
}
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع UploadInBackground دریافت میکند، به ترتیب به صورت زیر است:
- fileAddresses: لیستی از آدرس فایلها روی موبایل که میخواهید آنها را آپلود کنید.
- uploadPaths: لیستی از آدرسهای فایلهای نهایی آپلود شده را در سمت سرور مشخص میکند. یعنی، iامین فایل مشخص شده در آرایهی fileAddresses باید در مسیر iام مشخص شده در آرایهی uploadPaths قرار گیرد.
- replaces: لیستی از بولینها که مشخص میکند فایلها جایگزین شوند یا خیر. در صورتی که به ازای یک i، iامین مسیر مشخص شده در آرایهی uploadPaths قبلا وجود داشته و iامین بولین آرایهی replaces برابر false باشد، کل عمل آپلود دستهای با خطا مواجه میشود. در غیر این صورت، عمل آپلود دستهای موفقیتآمیز خواهد بود.
- callback: با به پایان رسیدن عمل آپلود صدا زده شده و پاسخ سرور را برمیگرداند.
همانطور که از کد بالا نیز واضح است، در صورتی که عمل آپلود موفقیتآمیز باشد، response.Body برابر لیست مسیرهای فایلهای آپلود شده خواهد بود. توضیحات قسمتهای قبل در مورد تفاوت response.Body با uploadPaths نیز کماکان در اینجا برقرار هستند. یعنی، برای ارجاعهای بعدی به فایلهای آپلود شده نیاز است که از مسیرهای معتبر response.Body استفاده کنید.
تغییر نام دستهای فایلها
برای تغییر نام فایلها به صورت دستهای کد زیر مورد استفاده قرار میگیرد:
new BacktoryFile.Bulk ().RenameInBackground (fileSavedUrls, newNames, (response) => {
if (response.Successful) {
IList<string> renamedFilesPaths = response.Body;
for(int i = 0; i < renamedFilesPaths.Count; i++) {
Debug.Log(i + "'th file path on server: " + renamedFilesPaths[i]);
}
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع RenameInBackground دریافت میکند، به ترتیب به صورت زیر است:
- fileSavedUrls: لیستی از آدرس فایلها را در سمت سرور مشخص میکند.
- newNames: لیستی از نامهای جدید را برای فایلها در سمت سرور مشخص میکند. یعنی، iامین فایل آرایهی fileSavedUrls باید به iامین رشتهی آرایهی newNames تغییر نام یابد.
- callback: با به پایان رسیدن عمل تغییر نام صدا زده شده و پاسخ سرور را برمیگرداند.
همانطور که از کد بالا نیز واضح است، در صورتی که عمل تغییر نام موفقیتآمیز باشد، response.Body برابر لیست آدرسهای جدید فایلها خواهد بود. توضیحات قسمتهای قبل در مورد ویژگیهای مهم response.Body نیز کماکان در اینجا برقرار هستند. یعنی، برای ارجاعهای بعدی به فایلهای تغییر نام یافته نیاز است که از مسیرهای معتبر response.Body استفاده کرده و برای حذف نام مخزن از ابتدای url ها میبایست از تابع
BacktoryFile.RemoveBucketNameFromRenameResponse
استفاده کنید.
حذف دستهای فایلها/پوشهها
برای حذف فایلها به صورت دستهای کد زیر مورد استفاده قرار میگیرد:
new BacktoryFile.Bulk ().DeleteInBackground (resourceUrls, deleteContentsIfFolderList, (response) => {
if (response.Successful) {
Debug.Log("Delete was successful.");
} else {
Debug.Log("failed; " + response.Message);
}
});
آرگومانهایی که تابع DeleteInBackground دریافت میکند، به ترتیب به صورت زیر است:
- resourceUrls: لیستی از آدرس فایلها در سمت سرور را مشخص میکند که میخواهیم حذف شوند.
- deleteContentsIfFolderList: لیستی از بولینها که مشخص میکنند، در صورتی که url با اندیس متناظر یک پوشه است، محتویات آن پاک شوند یا خیر.
- callback: با به پایان رسیدن عمل حذف صدا زده شده و پاسخ سرور را برمیگرداند.
به این ترتیب، شما با همهی قابلیتهای sdk بکتوری برای کار با فایلها و پوشهها آشنا شدید.