PDA

View Full Version : نحوه بررسي وجود يك فايل برروي سرور



reza_web
پنج شنبه 05 شهریور 1394, 10:38 صبح
سلام
من در برنامه خودم نياز دارم ببينم فايل مورد نظرم در سرور وجود دارد يا نه
مثلا در اين مسير :
http://www.mysite.com/song.mp3

اين كد را پيدا كردم ولي كار نكرد


public static boolean exists(String URLName){
try {
HttpURLConnection.setFollowRedirects(false);
// note : you may also need
// HttpURLConnection.setInstanceFollowRedirects(false )
HttpURLConnection con =
(HttpURLConnection) new URL(URLName).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}

reza_web
شنبه 07 شهریور 1394, 06:48 صبح
هيچكس نيست كمك كنه؟

raha_jon
شنبه 07 شهریور 1394, 09:03 صبح
سایزشو بخون بنظر من البته نمی دونم جواب میده یا نه!

tux-world
شنبه 07 شهریور 1394, 10:08 صبح
سایزشو بخون بنظر من البته نمی دونم جواب میده یا نه!

نکته خیلی قشنگی گفت. حتی به ذهن خود من هم نمیرسید. بی دردسرترین کار همینی هستش که این دوستمون گفت

reza_web
شنبه 07 شهریور 1394, 10:13 صبح
يعني چي كه سايزشو بخون؟
ميخواهم ببينم فايل وجود دارد يا نه

tux-world
شنبه 07 شهریور 1394, 10:27 صبح
همین دیگه. از این واضحتر آخه؟ شما فایل رو دارید مسیرشو. یه کانکت میزنید بهش سایزشو از سرور میگیرید. اگه صفر داد یا خطا داد یعنی نیستش دیگه. اگه مقداری رو پاس داد یعنی هست. از این واضحتر دیگه نمیشه توضیح داد :لبخندساده:

reza_web
شنبه 07 شهریور 1394, 10:43 صبح
از نظر تئوري بله دقيقا همينه كه شما مي فرماييد
ولي از نظر كدنويسي شما كدي كه من در بالاي همين تاپيك نوشتم را ببينيد ظاهرا مشكلي نداره و كار نميكنه
كجاش مشكل داره؟

reza_web
شنبه 07 شهریور 1394, 12:00 عصر
من اين نمونه كد را براي به دست آوردن سايز فايل برروي سرور پيدا كردم
http://stackoverflow.com/questions/2983073/how-to-know-the-size-of-a-file-before-downloading-it





URL url =new URL("http://server.com/file.mp3");
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
int file_size = urlConnection.getContentLength();
روي كد خودم كه گذاشتم بدون صورت شد:



URL url = null;
try {
url = new URL("http://server.com/file.mp3");
} catch (MalformedURLException e) {
e.printStackTrace();
}
URLConnection urlConnection = null;
try {
urlConnection = url.openConnection();
} catch (IOException e) {
e.printStackTrace();
}
try {
urlConnection.connect();
} catch (IOException e) {
e.printStackTrace();
}
int file_size = urlConnection.getContentLength();
Toast.makeText(QuizList.this, String.valueOf(file_size), Toast.LENGTH_SHORT).show();



اجرا كه ميكنه اين خطا را مي دهد:



at android.os.StrictMode$AndroidBlockGuardPolicy.onNe twork(StrictMode.java:1147)
at java.net.InetAddress.lookupHostByName(InetAddress. java:418)
at java.net.InetAddress.getAllByNameImpl(InetAddress. java:252)
at java.net.InetAddress.getAllByName(InetAddress.java :215)
at com.android.okhttp.HostResolver$1.getAllByName(Hos tResolver.java:29)
at com.android.okhttp.internal.http.RouteSelector.res etNextInetSocketAddress(RouteSelector.java:232)
at com.android.okhttp.internal.http.RouteSelector.nex t(RouteSelector.java:124)
at com.android.okhttp.internal.http.HttpEngine.connec t(HttpEngine.java:272)
at com.android.okhttp.internal.http.HttpEngine.sendRe quest(HttpEngine.java:211)
at com.android.okhttp.internal.http.HttpURLConnection Impl.execute(HttpURLConnectionImpl.java:373)
at com.android.okhttp.internal.http.HttpURLConnection Impl.getResponse(HttpURLConnectionImpl.java:323)
at com.android.okhttp.internal.http.HttpURLConnection Impl.getResponseCode(HttpURLConnectionImpl.java:49 1)
at ghazalina.nezarat.QuizList$2.onClick(QuizList.java :204)




اگه زحمتي نيست يه كمكي بكنيد

reza_web
شنبه 07 شهریور 1394, 13:03 عصر
ميشه يكي كمك كنه؟؟؟

karl2008
شنبه 07 شهریور 1394, 13:10 عصر
احتمالا شما از داخل thread تابع رو فراخوانی نکردید.
خطای android.os.StrictMode$AndroidBlockGuardPolicy.onNe twork
http://stackoverflow.com/questions/22395417/error-strictmodeandroidblockguardpolicy-onnetwork

در صورت استفاده از AsyncTask این خطا رخ نمیده.

MansoorJ
شنبه 07 شهریور 1394, 14:14 عصر
سلام

به نظرم از AsyncTask استفاده کنید و با استفاده متد OnPreExecute(String s) مقدار بازگشتی رو بگیرید.

موفق باشید.

raha_jon
شنبه 07 شهریور 1394, 18:37 عصر
سلام تشکر tux-world (http://barnamenevis.org/member.php?17548-tux-world) عزیز.
بفرما اینم کدش خودش ی کاریش کن


URLConnection conection = url.openConnection();
conection.connect();

int lenghtOfFile = conection.getContentLength();


کد آخر سایزو می خونه

c0mmander
یک شنبه 08 شهریور 1394, 08:47 صبح
برای بررسی دو فایل تنها راه قابل اطمینان md5 ساخته شده از دوتا فایل هست نه اینکه حجم نهایی رو مورد بررسی قرار دید! به عنوان مثال دوتا عکس مختلف با یک حجم! یا یک فایل سالم در مقابل یک فایلی که با همون حجم و فقط با بیت 0 پر شده.. تمام این ها مثال های نقیض روش شما هستند.

godofphp
یک شنبه 08 شهریور 1394, 10:14 صبح
چرا اینطوری میکنید اخه شما لقمه رو دور سرتون میچرخونید اخرشم نمیخورید
خب شما سمت سرور میتونی با php یا asp چک کنی ببینی فایل هست یا نه که هر دو برای این کار توابع اماده دارند بعد اگه بود مقدار 1 برگردون اگه نه مقدار 0
تمام

godofphp
یک شنبه 08 شهریور 1394, 10:15 صبح
اگه php هست سمت سرور بفرما این لینک (http://www.w3schools.com/php/func_filesystem_file_exists.asp)

c0mmander
یک شنبه 08 شهریور 1394, 10:28 صبح
چرا اینطوری میکنید اخه شما لقمه رو دور سرتون میچرخونید اخرشم نمیخورید خب شما سمت سرور میتونی با php یا asp چک کنی ببینی فایل هست یا نه که هر دو برای این کار توابع اماده دارند بعد اگه بود مقدار 1 برگردون اگه نه مقدار 0 تمام اگر اسم اون فایل در سمت سرور به دلیل افزایش امنیت تغییر کرده بود چی؟ با این تابع میشه؟

reza_web
سه شنبه 10 شهریور 1394, 11:47 صبح
من از همون دستور AsyncTask كه گفتيد استفاده كردم
اينو نوشتم



class exists extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
try {
URL url = new URL(params[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
int lengthofFile = conexion.getContentLength();
if(lengthofFile != -1) Global.ExistsFile = "File exist!";
else
Global.ExistsFile = "File does not exist!";
Toast.makeText(QuizList.this, Global.ExistsFile, Toast.LENGTH_SHORT).show();
Log.d("ANDRO_ASYNC", "Length of file: " + lengthofFile);
} catch (Exception e) {
// TODO: handle exception
Global.ExistsFile = "File error!";
Log.d("ANDRO_ASYNC", params[0] );
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
}
protected void onPreExecute(String... params) {
// TODO Auto-generated method stub
}
@Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
Log.d("ANDRO_ASYNC", values[0]);
}
}


و اونو بدين صورت صدا زدم:
new exists().execute("http://hw16.asset.aparat.com/aparat-video/d863306b934990bde445c56d4ee5701b2992102-360p__82528.mp4");

ولي باز كار نميكنه و در try به بخش handle exception مي رود!

كسي نمي تونه كمك كنه؟

reza_web
سه شنبه 10 شهریور 1394, 12:26 عصر
Can't create handler inside thread that has not called Looper.prepare()

اين خطايي است كه ميده

reza_web
سه شنبه 10 شهریور 1394, 13:08 عصر
مشكل را فهميدم
خط 13 را نبايد مي نوشتم
ممنون از همه

godofphp
سه شنبه 10 شهریور 1394, 19:17 عصر
اگر اسم اون فایل در سمت سرور به دلیل افزایش امنیت تغییر کرده بود چی؟ با این تابع میشه؟
یعنی چی ؟ اسم یک فایل مشخصه ی اون فایله
اگه اسم ملاک تشخیص فایل ها از هم نباشه پس به چه دردی میخوره ؟

c0mmander
چهارشنبه 11 شهریور 1394, 08:13 صبح
یعنی چی ؟ اسم یک فایل مشخصه ی اون فایله
اگه اسم ملاک تشخیص فایل ها از هم نباشه پس به چه دردی میخوره ؟

یعنی شما موقع آپلود فایل داخل پروژهاتون از همون اسم فایل اصلی استفاده میکنید؟ پیشهاد میکنیم در متدی که استفاده میکنید حتما نام رو تغییر هم بدید. میتونید دلیل این کار رو جستجو کنید.

godofphp
پنج شنبه 12 شهریور 1394, 09:56 صبح
یعنی شما موقع آپلود فایل داخل پروژهاتون از همون اسم فایل اصلی استفاده میکنید؟ پیشهاد میکنیم در متدی که استفاده میکنید حتما نام رو تغییر هم بدید. میتونید دلیل این کار رو جستجو کنید.
,متوجه منظورتون اصلا نمیشم