دانلود چندین فایل در یک لحظه از سرور
سلام
برای دانلود یک فایل از سرور مشکلی ندارم اما نمی دونم برای دانلود چندین فایل در یک لحظه (مثل بخش استیکرهای شبکه ای اجتماعی مثل لاین و وایبر که یه دفعه یه مجموعه استیکر رو دانلود می کنن) نمیدونم چیکار باید کنم.
فقط یه روش به ذهنم میرسه که تصاویر رو توی فایل زیپ بریزم اما مطمئنم که اشتباس.
اگر راهنمایی کنید ممنون میشم
من یک کلاس نوشتم (کلاس خود استاد را کمی توسعه دادم) که با اون دانلود هام رو انجام میدم.
public class ModuleDownloader {
private int downloadedSize;
private int totalSize;
private int percent;
private boolean isCancelled = false;
public int getDownloadedSize() {
return downloadedSize;
}
public int getTotalSize() {
return totalSize;
}
public int getPercent() {
return percent;
}
public ModuleDownloader download() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(downloadPath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.connect();
totalSize = connection.getContentLength();
// Create directory
String dirPath;
dirPath = filepath.substring(0, filepath.lastIndexOf("/"));
File dir = new File(dirPath);
dir.mkdirs();
File file = new File(filepath);
if (file.exists()) {
file.delete();
}
//FileOutputStream outputStream = new FileOutputStream(filepath);
File f = new File(filepath);
f.createNewFile();
FileOutputStream outputStream = new FileOutputStream(f);
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[8192];
int len = 0;
while ( !isCancelled && ((len = inputStream.read(buffer)) > 0)) {
outputStream.write(buffer, 0, len);
downloadedSize += len;
percent = (int) (100.0f * (float) downloadedSize / totalSize);
if (progressListener != null) {
final int finalDownloadedSize = downloadedSize;
G.HANDLER.post(new Runnable() {
@Override
public void run() {
progressListener.onProgressDownload(percent,
finalDownloadedSize, totalSize);
}
});
}
if (simulate) {
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
outputStream.close();
if (isCancelled)
{
if (file.exists()) {
file.delete();
}
}
else
completeListener.OnDownloadComplete(filepath);
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
return this;
}
private String downloadPath;
private String filepath;
private OnProgressDownloadListener progressListener;
private OnDownloadCompleteListener completeListener;
private boolean simulate;
public ModuleDownloader downloadPath(String value) {
downloadPath = value;
return this;
}
public ModuleDownloader filepath(String value) {
filepath = value;
return this;
}
public ModuleDownloader progressListener(OnProgressDownloadListener value) {
progressListener = value;
return this;
}
public ModuleDownloader completeListener(OnDownloadCompleteListener value) {
completeListener = value;
return this;
}
public ModuleDownloader simulate(boolean value) {
simulate = value;
return this;
}
public void cancel() {
isCancelled = true;
}
}
در کلاس فوق دو Lintener تعریف کرده ام برای اینکه مقدار پیشرفت دانلود و زمان تمام شدن دانلود را به کسی که دانلودر را صدا میزند خبر دهد.
دو فایل جاوا به اسم های OnDownloadCompleteListener.java و OnProgressDownloadListener.java با محتویات زیر را هم به پروژه اضافه کنید :
public interface OnDownloadCompleteListener {
public void OnDownloadComplete(String filePath);
}
و
public interface OnProgressDownloadListener {
public void onProgressDownload(int percent, int downloadedSize, int fileSize);
}
حالا توی کد اصلی که می خواهید یک فایل را دانلود کنید یک تابع به صورت زیر می نویسید :
من یک ProgressBar دارم و یک TextView برای نمایش درصد.
private void startDownload(final String downloadURL,final String filePath
, final ProgressBar prgDownloadProgress
, final TextView txtPercent) {
ModuleDownloader downloadRequest = new ModuleDownloader();
OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {
@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
prgDownloadProgress.setProgress(percent);
txtPercent.setText(percent + "%\n"
+ String.format("%.1f KB", downloadedSize / 1024.0)
+ " / " + String.format("%.1f KB", fileSize / 1024.0));
}
});
}
};
OnDownloadCompleteListener completeListener = new OnDownloadCompleteListener() {
@Override
public void OnDownloadComplete(final String filepath) {
G.HANDLER.post(new Runnable() {
@Override
public void run() {
prgDownloadProgress.setVisibility(View.GONE);
txtPercent.setText("فایل جدید با موفقیت در مسیر زیر دانلود شد.\n" + filepath);
}
});
// Here is place to do all operation with the new file
}
};
downloadRequest.downloadPath(downloadURL)
.filepath(filePath)
.simulate(true)
.progressListener(progressListener)
.completeListener(completeListener);
downloadRequest.download();
}
حالا جایی که می خواهیم یک فایل را دانلود کنیم تابع فوق را درون یک Thread جدید صدا می کنیم.
(با توجه به اینکه من برای نمایش مقدار پیشرفت از یک ProgressBar و یک TextView استفاده می کردم View مربوط به این دو را به این تابع ارسال می کنم. شما می توانید آن را حذف کنید یا به اشیاء مورد نیاز خودتان تغییرشان دهید)
Thread thread= new Thread(new Runnable() {
@Override
public void run() {
startDownload(downloadURL ,filePath ,prgDownloadProgress ,txtPercent);
}
});
downloadURL آدرس اینترنتی فایل است و filePath آدرسی که فایل در آن ذخیره می شود.
بدیهی است که شما چند سطر فوق را می توانید درون یک حلقه قرار دهید و تعداد زیادی از آن را صدا کنید و این در حالی است که هر بار که thread صدا زده می شود در پس زمینه شروع به دانلود می کند و حلقه می تواند همزمان همه thread ها را سریع اجرا کند.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .