آموزش دانلود فایل از وب سرور در اندروید
سلام دوستان در این سری از آموزش های برنامه نویسی اندروید به آموزش دانلود فایل از وب سرور در اندروید می پردازیم دانلود کردن فایل از وب سرور ممکن است بعضی مواقع مورد نیاز باشد به طور مثال شما باید یک فایل zip حاوی یکسری دیتا رو دانلود کنید و برنامه شما اون دیتا رو به عنوان یه دیتا مهم در برنامه اش استفاده کند یا یک سری عکس را از وب سرور بگیرید و در یک اسلایدر نمایش دهید در ادامه ما همراه باشید.
ابتدا ما باید یک کلاس در همون کلاسی که می خواییم فایل دانلود بشه ایجاد کنیم (مثلا می خوایم توی Mainactivity فایل دانلود بشه باید این کلاس رو زیر آن قرار دهیم).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | private class DownloadTask extends AsyncTask<String, Integer, String> { private Context context; private PowerManager.WakeLock mWakeLock; public DownloadTask(Context context) { this.context = context; } @Override protected String doInBackground(String... sUrl) { InputStream input = null; OutputStream output = null; HttpURLConnection connection = null; try { URL url = new URL(sUrl[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); // HTTP 200 OK if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { return "Server returned HTTP " + connection.getResponseCode() + " " + connection.getResponseMessage(); } int fileLength = connection.getContentLength(); input = connection.getInputStream(); output = new FileOutputStream("/sdcard/zipfile.zip"); byte data[] = new byte[4096]; long total = 0; int count; while ((count = input.read(data)) != -1) { if (isCancelled()) { input.close(); return null; } total += count; if (fileLength > 0) publishProgress((int) (total * 100 / fileLength)); output.write(data, 0, count); } } catch (Exception e) { return e.toString(); } finally { try { if (output != null) output.close(); if (input != null) input.close(); } catch (IOException ignored) { } if (connection != null) connection.disconnect(); } return null; } |
در بالا ما از کلاس Async Task استفاده کردیم که این کلاس باعث هماهنگی دانلود می شود که خود آن یک doinBackground دارد که باعث می شود کاربر با آن درگیر نشود و برنامه در پشت زمینه کار دانلود را انجام دهد. ما یکسری موارد را در برنامه بررسی کردیم به طور مثال بررسی کردیم آیا سرور فعال است یا نه برای این کار یک request به سرور ارسال می کنیم سپس اگر عدد 200 یعنی (server ok) بازگشت متوجه می شویم اون سرور یا اون url سالم است. متغییر fileLength اندازه فایل را بر می گرداند و از این در جلوتر استفاده خواهیم کرد و connection.getInputStream که در بالاتر ما connection را تعریف کرده بودیم فایل را به صورت byte دریافت می کند.
با کد بالا شما می توانید هر فایلی را دانلود کنید برای اینکه فایل های دیگه رو دریافت کنید باید در خط زیر تغییراتی را اعمال کنید.
1 | output = new FileOutputStream("/sdcard/zipfile.zip"); |
به جای zipfile.zip نام فایل و پسوندش را جایگزین کنید.
ما از try و catch استفاده کردیم تا در صورتی که اینترنت قطع شد یا خطایی رخ داد برنامه force close ندهد.
حالا برای اینکه از این کلاس استفاده کنیم در اکتویتی خودتان کد زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ProgressDialog mProgressDialog; mProgressDialog = new ProgressDialog(YourActivity.this); mProgressDialog.setMessage("Loading"); mProgressDialog.setIndeterminate(true); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); final DownloadTask downloadTask = new DownloadTask(YourActivity.this); downloadTask.execute("لینک دانلود فایل شما"); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { downloadTask.cancel(true); } }); |
فکر نمی کنم نیازی به توضیح اضافی برای کد بالا باشد ولی نحوه کار به این شکل است که ما یک ProgressDialog ایجاد می کنیم و آن تا زمانی به کاربر نمایش داده می شود تا فایل ما دانلود شود.
می تونید از ProgressDialog استفاده نکنید ولی منطقی این است که از آن استفاده کنید ما قبلتر آموزش ProgressDialog را در سایت قرار داده بودیم کافی است یک سرچی در سایت بزنید.
بعد از این کار مثل همیشه باید دسترسی را اضافه کنیم در صورتی که این دسترسی ها را به برنامه اضافه نکنید برنامه شما force close می دهد.
وارد فایل Androidmanifest.xml شوید و خط های زیر را به آن اضافه کنید.
1 2 3 | <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
این آموزش هم به پایان رسید امیدوارم نیاز شما را بر طرف کرده باشم
موفق باشید.
سلام ببخشید میشه راهنمایی کنید الان من بخوام این کلاسو صدا بزنم با یه لینک چه کدی بنویسم بعد این که من میخوام این کلاسو تغییر بدم تا دو تا لینک بگیره چه کنم؟
سلام و درود
به نظرم آموزش کامل است شما برای دانلود کافی است از کد زیر استفاده کنید که در آموزش به آن اشاره کردیم
به جای youractivity نام اکتویتی خودتان را قرار دهید و این متد فقط یک لینک میگیرد شما می توانید دوبار از این کلاس استفاده کنید یا مقدار ورودی را به آرایه تبدیل کنید تا تعداد ورودی بیشتر نیز بگیرد برای این کار باید کلاس اصلی را تغییر دهید.
موفق باشید.
میشه بپرسم برای این که ارایه ای کنم باید کدوم متغییر و تغییر بدم اخه من از کلاس خیلی سردرنیاوردم
سلام حدودا باید همه را به ارایه تبدیل کنید (راحت ترین کار برای شما دوبار فرخوانی آن است دوبار همان کلاس را اجرا کنید)
موفق باشید.
نمیشه اخه فایل هام کلا فرق میکنه و باید دوجای جدا ذخیره شه و با اسم ها و پسوند های مختلف
خب همون رو دوباره دانلود کنید اسمش رو تغییر دهید
فقط میخوام بدونم کجای کلاس گفته که لینک بگیره بقیشو درست میکنم خودم نمیتونم بفهمم کجا لینک رو میگیره
سلام و درود
این بخش لینک دانلود رو میگیره
و دانلود می کنه ولی شما باید کل کد رو تغییر بدهید از doInbackground گرفته تا
هم باید تغییر کند
سلام دوست عزیز
ممنون با بت آموزش خوبتون
فقط یه نکته برنامه واسه من دانلود رو به صورت کامل انجام میده اما ProgressDialog اصلا نشون نمیده
show هم کردم نشون داد اما پر نمیکنه
سلام و درود
در اندروید بالای 5 باید از runtimepermission استفاده کنید که در بالا استفاده نشده همین واژه رو سرچ کنید در سایت هست آموزشش
موفق باشید.
سلام
ابتدا تشکر میکنم از آموزش و سایت خوبتون …
اما باید بگم اینکه بخای یک آدرس اینترنتی بزاری که فایده نداره … برنامه باید طوری باشه که هر فایلی که قابل دانلود باشه در یک لیست قرار بگیره و کاربر با کلیک روی اون بتونه فایل رو دانلود بکنه …
… لطفا یک آموزش بزارید … که چطور میشه مطالب سایت هایی که دارای api هستند رو از طریق کتابخونه json و volly بر روی برنامه دریافت کرد …
ممنون
سلام و درود
برای اینکار کافیه شما یک api داشته باشید و آن را در لیست نمایش دهید بعد از اینکا با کلیک بروی هر آیتم لینک هر مثلا عکس رو از طریق همون api به دست بیارید و به کلاس بعدی که مثلا کارش عمل دانلود هست پاس بدید.
موفق و پیروز باشید.
سلام ممنون از اموزشتون
من روی اندروید 4.4.2 امتحان کردم دانلود میشه و توی progress Bar نشون میده ولی پر نمیشه . پروگرس بار اصلا پر نمیشه ولی فایل دانلود میشه و پروگرس بار حتی بعد از اتمام دانلود همچنان در حال اجرا هست .
سلام. چون تو این آموزش کار با ProgressBar رو کامل پیاده نکردن و فقط قسمت ارسال مقدار لودینگ (متد setProgress) رو نوشتن که اینم لازمش اینه که متدهای دیگه کلاس AsyncTask ( یعنی onProgressUpdate و onPostExecute ) هم پیاده سازی بشن. متاسفانه این آموزش ناقصه ولی یه آموزش بهتر از این روی سایت هست، میتونید به اون مراجعه کنید از لینک زیر:
https://programchi.ir/2017/08/03/%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af-%d8%b9%da%a9%d8%b3-%d9%88-%d9%86%d9%85%d8%a7%db%8c%d8%b4-progressbar-%d8%af%d8%b1-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%a7%d9%86/
سلام. چون تو این آموزش کار با ProgressBar رو کامل پیاده نکردن و فقط قسمت ارسال مقدار لودینگ (متد publishProgress) رو نوشتن که اینم لازمش اینه که متدهای دیگه کلاس AsyncTask ( یعنی onProgressUpdate و onPostExecute ) هم پیاده سازی بشن. متاسفانه این آموزش ناقصه ولی یه آموزش بهتر روی سایت هست، میتونید به اون مراجعه کنید از لینک زیر:
https://programchi.ir/2017/08/03/%d8%af%d8%a7%d9%86%d9%84%d9%88%d8%af-%d8%b9%da%a9%d8%b3-%d9%88-%d9%86%d9%85%d8%a7%db%8c%d8%b4-progressbar-%d8%af%d8%b1-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%a7%d9%86
سلام ،من از این کد استفاده کردم توی اجرای برنامه خیلی وقتا فایل دانلود نمیشه . progressdialogرو هم نشون نمیده! البته حجم فایل خیلی پایینه شاید بخاطر اون باشه .لطفا کمک کنید مشکل رو پیدا کنم
سلام خسته نباشید
لینک دانلود من در دیتابیس mysql قرار داره و میخوام وارد یک صفحه ای که شد، فایل مربوط به همون صفحه رو کاربر اگر خواست دانلود کنه
میشه راهنمایی کنید که چجوری باید این عملیات رو پیاده سازی کنم؟