آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

دانلود چندین فایل در یک لحظه از سرور

hosseinAmini  11 سال پیش  11 سال پیش
+1 0

سلام
برای دانلود یک فایل از سرور مشکلی ندارم اما نمی دونم برای دانلود چندین فایل در یک لحظه (مثل بخش استیکرهای شبکه ای اجتماعی مثل لاین و وایبر که یه دفعه یه مجموعه استیکر رو دانلود می کنن) نمیدونم چیکار باید کنم.
فقط یه روش به ذهنم میرسه که تصاویر رو توی فایل زیپ بریزم اما مطمئنم که اشتباس.

اگر راهنمایی کنید ممنون میشم

+1 0
اگر تعداد فایل زیاده و حجمش به نسبت کم خوب این روش خوبه در غیر اینصورت باید چندتا چند تا دانلود بشه یا اینکه امکان resume برای فایل زیپ دانلود شده قرار داده بشه (11 سال پیش)
+2 0
چه فرقی می کنه که بخوای یک فایل دانلود کنی یا چند تا ؟ کد مربوط به دانلود فایل را بریز داخل یک تابع یا یک کلاس براش ایجاد کن. بعد به ازای هر استیکر یک thread جدید ایجاد کن و یکی از اون کلاس new کن و تابعش رو اجرا کن. (11 سال پیش)
0 0
طاهر حجم فایل ها خیلی زیاد نیست، مشکل من اینه که میخوام در آن واحد چندتا فایل رو دانلود کنم ولی نمی دونم چیکار کنم. تو فایل زیپ هم نمیشه بزارم فایل ها رو (11 سال پیش)
0 0
AhmadVB متوجه نشدم چیکار باید کنم، اگر امکان داره بیشتر توضیح بدید (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
AhmadVB  11 سال پیش
+9 0

من یک کلاس نوشتم (کلاس خود استاد را کمی توسعه دادم) که با اون دانلود هام رو انجام میدم.

 
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 ها را سریع اجرا کند.

0 0
ممنون. عالی بود و مشکل منو به خوبی حل کرد.کلی چیز ازش یاد گرفتم.باز هم تشکر (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .