ورود

View Full Version : مشکل با گرفتن حم فایل از سرور



shahin bahari
شنبه 24 خرداد 1393, 01:48 صبح
سلام
تو برنامه لازم دارم که یه فایل رو از اینترنت دانلود کنم. برای این کار از HttpUrlConnection استفاده میکنم.
مشکلی که دارم اینه که تمام هدر های این کانکشن نال هست! مثلا برای گرفتن حجم مینویسم:
connection.getContentLength();
مقدار -1 رو بر میگردونه و یا
connection.getHeaderFields().get("content-Lenght");
که نال رو بر میگردونه.
برای چک کردن قابلیت resume و گرفتن اسم فایل روی سرور هم هدرهاش رو امتحان کردم ولی بازم نال هست!
مساله جالب اینجاست که توی لوپی که از inputStream این کانکشن ساختم فایل به خوبی دانلود میشه!!! اصلا سر در نمیارم چرا طول محتوا رو -1 نشون میده ولی فایل بدون مشکل دانلود میشه؟!
دوستانی که تجربه کار با دانلودر ها رو دارن، حجم فایل رو چطور بدست میارن؟

c0mmander
یک شنبه 25 خرداد 1393, 05:48 صبح
در سی شارپ باید دو نوع http کانکشن ساخت یکی از نوع تقاضا دهنده(webrequest) و یک نوع هم به نام پاسخ داده شده (webResponse) هست.

اما نکته ای که هست اینه که دستور زیر بافرض تعریف webresponse :


fileSize = webResponse.ContentLength;

که filesize حجم فایل هست اما نکته ای که اینجا هست اینه که خروجی این دستور باید از نوع (int64) باشه. (یعنی همون long).

shahin bahari
یک شنبه 25 خرداد 1393, 17:41 عصر
سلام
ممنون که پاسخ دادید. راستش تو مثال هایی که تو نت دیده بودم همه از طریق همین کانکشن طول داده رو میگرفتند و بعید میدونم با استریمی که برگردونده بشه حجم رو گرفت. حالا باز یه امتحان می کنم شاید جواب داد! اگه جواب داد خبرش رو میدم.
تابع connection.getContentLength(); هم باید long برگردونه.

c0mmander
دوشنبه 26 خرداد 1393, 05:09 صبح
در سی شارپ هیچ استریمی تعریف نمیشه برای تقاضا دادن. بلکه فقط تقاضا یا ارسال میشه و یا دریافت میشه در دریافت باید از دستور ها و ساختار های دریافت استفاده کرد و در ارسال هم باید از ساختار ارسال این دوتا یعنی webrequest و webResponse به هیچ عنوان یکی نیستن. بلکه بعد از ارسال تقاضا به http با استفاده از webrequest باید با webResponse اون رو درون یک استریم یا بافر کرد و ذخیره کرد.



// دادن تقاضا به وب سرور برای اطلاعات فایل
private Http_WebReq webRequest;
// پاسخ وب سرور برای دریافت اطلاعات فایل
private Http_WebRes webResponse;