PDA

View Full Version : دانلود نشدن عکس از یک URL



بیتا حکمت
دوشنبه 13 بهمن 1393, 21:01 عصر
سلام . من از این سورس برای دانلود عکس استفاده می کنم . اما خطا داره . مخیوام عکس از یک URL دانلود بشه و در یک پوشه ذخیره بشه .



string localFilename = @"c:\localpath\tofile.jpg";
using (WebClient client = new WebClient())
{
client.DownloadFile("http://media.isna.ir/content/1422698777897_Mehdi%20Ghasemi-43.jpg/2", localFilename);
}



سوال دوم اینکه : ممکنه موقع ذخیره کردن عکسی ، عکس جدید همنام با یکی از فایل های تو پوشه باشه . برای جلوگیری از این کاری چه باید کرد ؟

لینک صفحه ای که کد رو برداشتم : http://stackoverflow.com/questions/16275391/download-and-show-an-image-from-a-url-in-background

aminmousavi
سه شنبه 14 بهمن 1393, 00:37 صبح
سلام دوست عزیز کدتون سالمه ، اما مشکلی که دارین اینکه آدرس عکس که گذاشتین بصورت فیزیکی عکس نیست ! برای همین با DownlaodFIle نمیتونین دانلود کنین در اصل نصب به آدرس وارد شده سرور براتون عکس رو Response میکنه .
برای همین باید به شکل زیر اطلاعات رو بخونین :

public System.Drawing.Image DownloadImage(string _URL)
{
System.Drawing.Image _tmpImage = null;


try
{
System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.HttpWebReque st.Create(_URL);
_HttpWebRequest.AllowWriteStreamBuffering = true;
_HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
_HttpWebRequest.Referer = "http://www.google.com/";
_HttpWebRequest.Timeout = 20000;
System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse();
System.IO.Stream _WebStream = _WebResponse.GetResponseStream();
_tmpImage = System.Drawing.Image.FromStream(_WebStream);
_WebResponse.Close();
_WebResponse.Close();
}
catch (Exception _Exception)
{
return null;
}


return _tmpImage;
}


در خصوص سوال دوم قرمز رنگ ، با دیدی که پروژه شما دارم چون شما به ازای هر صفحه یک رکورد توی دیتابیس میسازین به نظرم عکس هر صفحه رو توی یک فولدر جداگانه بریزید ، اسم فولدر هم برابر با id رکورد قرار بدین مثلا آدرس این عکس میشه : www.exmaple.com/images/1/1422698777897_Mehdi%20Ghasemi-43.jpg/2

اینجوری عکس ها خیلی بعیده (فکر میکنم میل کنه به صفر احتمالش :دی) جایگزین شن . اما تو این حالت یک مشکلی دارین اینکه چون قبل از درج رکورد باید id رو بدونین دیگه نمیتوین id رو autonumber بزارین ، باید دستی خودتون id بهش بدین .

یا روش ساده تر اینکه کلا چک کنین اگر تکراری بود ، یک کاراکتر به اسم فایل اضافه کنین .

sajadsobh
سه شنبه 14 بهمن 1393, 05:20 صبح
در خصوص سوال دوم قرمز رنگ ، با دیدی که پروژه شما دارم چون شما به ازای هر صفحه یک رکورد توی دیتابیس میسازین به نظرم عکس هر صفحه رو توی یک فولدر جداگانه بریزید ، اسم فولدر هم برابر با id رکورد قرار بدین مثلا آدرس این عکس میشه : www.exmaple.com/images/1/1422698777897_Mehdi%20Ghasemi-43.jpg/2 (http://www.exmaple.com/images/1/1422698777897_Mehdi%20Ghasemi-43.jpg/2)

اینجوری عکس ها خیلی بعیده (فکر میکنم میل کنه به صفر احتمالش :دی) جایگزین شن . اما تو این حالت یک مشکلی دارین اینکه چون قبل از درج رکورد باید id رو بدونین دیگه نمیتوین id رو autonumber بزارین ، باید دستی خودتون id بهش بدین .

یا روش ساده تر اینکه کلا چک کنین اگر تکراری بود ، یک کاراکتر به اسم فایل اضافه کنین .

با SCOPE_IDENTITY() میشه آیدی آخرین رکوردی که Insert شده رو بدست آورد که :لبخندساده:

بیتا حکمت
سه شنبه 14 بهمن 1393, 05:55 صبح
با SCOPE_IDENTITY() میشه آیدی آخرین رکوردی که Insert شده رو بدست آورد که :لبخندساده:

سلام . مرسی اما دستوری که گفتین مناسب پروژه ای که میخوام انجام بدم نیست .

بیتا حکمت
سه شنبه 14 بهمن 1393, 05:57 صبح
سلام دوست عزیز کدتون سالمه ، اما مشکلی که دارین اینکه آدرس عکس که گذاشتین بصورت فیزیکی عکس نیست ! برای همین با DownlaodFIle نمیتونین دانلود کنین در اصل نصب به آدرس وارد شده سرور براتون عکس رو Response میکنه .
برای همین باید به شکل زیر اطلاعات رو بخونین :

public System.Drawing.Image DownloadImage(string _URL)
{
System.Drawing.Image _tmpImage = null;


try
{
System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.HttpWebReque st.Create(_URL);
_HttpWebRequest.AllowWriteStreamBuffering = true;
_HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
_HttpWebRequest.Referer = "http://www.google.com/";
_HttpWebRequest.Timeout = 20000;
System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse();
System.IO.Stream _WebStream = _WebResponse.GetResponseStream();
_tmpImage = System.Drawing.Image.FromStream(_WebStream);
_WebResponse.Close();
_WebResponse.Close();
}
catch (Exception _Exception)
{
return null;
}


return _tmpImage;
}


در خصوص سوال دوم قرمز رنگ ، با دیدی که پروژه شما دارم چون شما به ازای هر صفحه یک رکورد توی دیتابیس میسازین به نظرم عکس هر صفحه رو توی یک فولدر جداگانه بریزید ، اسم فولدر هم برابر با id رکورد قرار بدین مثلا آدرس این عکس میشه : www.exmaple.com/images/1/1422698777897_Mehdi%20Ghasemi-43.jpg/2 (http://www.exmaple.com/images/1/1422698777897_Mehdi%20Ghasemi-43.jpg/2)

اینجوری عکس ها خیلی بعیده (فکر میکنم میل کنه به صفر احتمالش :دی) جایگزین شن . اما تو این حالت یک مشکلی دارین اینکه چون قبل از درج رکورد باید id رو بدونین دیگه نمیتوین id رو autonumber بزارین ، باید دستی خودتون id بهش بدین .

یا روش ساده تر اینکه کلا چک کنین اگر تکراری بود ، یک کاراکتر به اسم فایل اضافه کنین .

روشی که گفتین برا ادرس http://media.isna.ir/content/1422698777897_Mehdi%20Ghasemi-43.jpg/2 جواب نداد



System.Drawing.Image image = DownloadImageFromUrl("http://images.betterphoto.com/0005/011001181122baby_print_v2_sm_t.jpg");
//http://media.isna.ir/content/1422698777897_Mehdi%20Ghasemi-43.jpg/2 // وقتی از این ادرس دوم استفاده می کنم خطا رخ می ده
string rootPath = @"C:\DownloadedImageFromUrl";
string fileName = System.IO.Path.Combine(rootPath, "test2.jpg");
image.Save(fileName);

aminmousavi
سه شنبه 14 بهمن 1393, 13:22 عصر
مطمئنین ؟ :متفکر:
من تست کردم جواب داد :

public System.Drawing.Image DownloadImage(string _URL)
{
System.Drawing.Image _tmpImage = null;


try
{
System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.HttpWebReque st.Create(_URL);
_HttpWebRequest.AllowWriteStreamBuffering = true;
_HttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
_HttpWebRequest.Referer = "http://www.google.com/";
_HttpWebRequest.Timeout = 20000;
System.Net.WebResponse _WebResponse = _HttpWebRequest.GetResponse();
System.IO.Stream _WebStream = _WebResponse.GetResponseStream();
_tmpImage = System.Drawing.Image.FromStream(_WebStream);
_WebResponse.Close();
_WebResponse.Close();
}
catch (Exception _Exception)
{
return null;
}


return _tmpImage;
}


protected void Page_Load(object sender, EventArgs e)
{

List<string> addres=new List<string>();
addres.Add("http://images.betterphoto.com/0005/011001181122baby_print_v2_sm_t.jpg");
addres.Add("http://media.isna.ir/content/1422698777897_Mehdi%20Ghasemi-43.jpg/2");
for (int i = 0; i < addres.Count; i++)
{
DownloadImage(addres[i]).Save("C:\\images\\"+i.ToString()+".jpg");
}
}

بیتا حکمت
سه شنبه 14 بهمن 1393, 14:21 عصر
داستانی شد جریان عکس : دی
دلیلشو نمی دونم اما متدی که شما نوشتین ، اجرا نمیشه و مشکل پایین پیش میاد
http://8pic.ir/images/1wa3orvnufn38sh7dx6t.jpg

منم با اجازه اتون کد برادر راجا رو از سایتش برداشتم ، این کد اجرا شد ولی اون عکسی رو که گفتم دانلود نکرد

لینک سایتی که کد رو برداشتم :

http://www.dotnetspider.com/resources/42565-Download-images-from-URL-using-C.aspx

بیتا حکمت
سه شنبه 14 بهمن 1393, 14:38 عصر
ریشه مشکل رو متوجه شدم ، دستوری که شما استفاده کردین تو فریم 4 پشتبانی نمیشه ، اگر DLL مربوطه رو دانلود کنم مشکل حل میشه؟

aminmousavi
سه شنبه 14 بهمن 1393, 15:03 عصر
نه دوست عزیز . ارتباطی به دات نت 4 نداره . دلیل خطا اینکه ادیتور برنامه نویس توی کد space انداخته شده : (System.Net.HttpWebRequest)System.Net.HttpWebReque st.Create(_URL);
که در اصل هست : (System.Net.HttpWebRequest)System.Net.HttpWebReque st.Create(_URL);

از اون کد اولی که قرار دادم استفاده کنین میتونین دانلود کنین اون لینک عکس رو