PDA

View Full Version : عدو نمايش عكس در گريد ويو



mohsen.nsb44
یک شنبه 20 تیر 1389, 10:34 صبح
سلام من به وسيله كد زير عكس رو در ديتابيس + يك توضيح ذخيري ميكنم


int len = FileUpload1.PostedFile.ContentLength;
byte[] pic = new byte[len];
FileUpload1.PostedFile.InputStream.Read(pic, 0, len);
//
SqlConnection connection = new SqlConnection();
connection.ConnectionString = @"data source=.\sqlexpress;initial catalog=test;integrated security=true;";
try
{
connection.Open();
SqlCommand cmd = new SqlCommand("insert into table1 "
+ "(Pic, Comment) values (@pic, @text)", connection);
cmd.Parameters.Add("@pic", pic);
cmd.Parameters.Add("@text", TextBox1.Text);
cmd.ExecuteNonQuery();
}
finally
{
connection.Close();
}

اگه ميشه در مورد سه خط اول يه توضيح بدين ممنون ميشم

حال اومد يك گريد ويو و sqldatasource در صفحه قرار دادم

و گريد ويو رو به صورت زير تغيير دادم اما به جاي عكس ضرب در ديده ميشه اما متن(توضيح عكس) ديده ميشه دليل اينكه عكس ديده نمي شه چيه؟


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1" Height="133px" Width="216px">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="Image1" runat="server" Height="42px"
ImageUrl='<%# Eval("pic") %>' Width="60px" />
<asp:Label ID="Label1" runat="server" Text='<%# Eval("comment") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

mosi123
یک شنبه 20 تیر 1389, 10:44 صبح
این مشکل قبلا مشکل من هم بود. و اشتباهم این بود که یک مرحله از کار را فراموش کرده بودم. از زبانه Smar tag Task کنترل گریدویو به قسمت Edit Culomns و بعد از آن از بخش Available fields گزینه ImageField را َAdd نمایید و در قسمت Properties برایش هیدر و سایر ویژگیها را تعریف کنید و درنهایت Ok بزنید، شاید انشاء الله حل شود.

mohsen.nsb44
یک شنبه 20 تیر 1389, 10:52 صبح
این مشکل قبلا مشکل من هم بود. و اشتباهم این بود که یک مرحله از کار را فراموش کرده بودم. از زبانه Smar tag Task کنترل گریدویو به قسمت Edit Culomns و بعد از آن از بخش Available fields گزینه ImageField را َAdd نمایید و در قسمت Properties برایش هیدر و سایر ویژگیها را تعریف کنید و درنهایت Ok بزنید، شاید انشاء الله حل شود.
دوست عزيز موفق نشدم من در قسمت ويرايش تمپليت گريد ويو يك عكس قرار دادم و بر روي edit databinding كليك كردم در قسمت custon binding - اسم فيلد جدولم رو نوشتم Eval("pic") و بر روي end atabinding كليك كردم و ادامه ماجرا ...
به گفته شما اگه ImageField رو اضافه كنم چطور بايد به فيلد جدولم مرتبط كنم كه عكس رو نشون بده؟؟؟؟؟؟؟؟؟؟؟؟؟
در ديتاليست كه ديگه نمي شه ImageField اضافه كرد در اين كنترل چه بايد كرد؟

mosi123
یک شنبه 20 تیر 1389, 10:56 صبح
دوست عزيز موفق نشدم من در قسمت ويرايش تمپليت گريد ويو يك عكس قرار دادم و بر روي edit databinding كليك كردم در قسمت custon binding - اسم فيلد جدولم رو نوشتم Eval("pic") و بر روي end atabinding كليك كردم و ادامه ماجرا ...
به گفته شما اگه ImageField رو اضافه كنم چطور بايد به فيلد جدولم مرتبط كنم كه عكس رو نشون بده؟؟؟؟؟؟؟؟؟؟؟؟؟

بله این هم مشکلی هست که باید حل شود. سایر دوستان راه حلهای بهتری ارائه خواهند داد. ضمنا یک تاپیک دقیقا با عنوان تاپیک شما حدود یک هفته پیش زده بودم که دوستان راهنمایی های خوبی داشتند. سرچ کنید . شاید جواب مشکل شما در آن باشد.

mohsen.nsb44
یک شنبه 20 تیر 1389, 11:16 صبح
دوستان من image fild رو هم اضافه كردم و در قسمت dataimageurlfield هم اسم فيلد(pic)ديتابيسم رو اضافه كردم اما بازم به صورت ضربدر عكس ديده مي شود در صورتي كه عكس با موفقيعت در ديتابيس ثبت شده است.
لطفا راهنمايي كنيد.
جستجو كردم چيزي پيدا نكردم لطفا كمك كنيد.

rana-writes
یک شنبه 20 تیر 1389, 11:56 صبح
سلام
شما اسم عکس رو ذخیره می کنین با این کار درسته؟
یه نگاهی به بانکتون بندازین و چک کنین لطفا
اگه اسم عکس رو ذخیره می کنین، طبیعتا باید موقع آدرس دهی اسم فولدرهاتون رو هم بگین و در آخر به اسم عکس برسین
مثل این :


<img alt="<%# Eval("Note")%>" height="74px" width="96" src="Photos/<%# Eval("AlbumDir")%>/Thumbs/<%# Eval("ImageName")%>" />

توی این کد قسمت اول یه توضیح در مورد عکسه، بعد از شاخه Photo که عکسها رو ذخیره کرده شروع میکنه، اسم آلبوم رو هم از بانک میگیره و در نهایت نام عکس هم از بانک خونده میشه
باید ببینین مسیر عکستون کجاست و تقریبا به این شکل عمل کنین
موفق باشین

Peyman.Gh
یک شنبه 20 تیر 1389, 11:57 صبح
بجای خود تصویر چرا آدرس تصویر را در پایگاه داده ذخیره نمی کنید ؟

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:00 عصر
سلام
شما اسم عکس رو ذخیره می کنین با این کار درسته؟
یه نگاهی به بانکتون بندازین و چک کنین لطفا
اگه اسم عکس رو ذخیره می کنین، طبیعتا باید موقع آدرس دهی اسم فولدرهاتون رو هم بگین و در آخر به اسم عکس برسین
مثل این :


<imgalt="<%# Eval("Note")%>"height="74px"width="96"src="Photos/<%# Eval("AlbumDir")%>/Thumbs/<%# Eval("ImageName")%>"/>

توی این کد قسمت اول یه توضیح در مورد عکسه، بعد از شاخه Photo که عکسها رو ذخیره کرده شروع میکنه، اسم آلبوم رو هم از بانک میگیره و در نهایت نام عکس هم از بانک خونده میشه
باید ببینین مسیر عکستون کجاست و تقریبا به این شکل عمل کنین
موفق باشین
نه اسم عكسو ذخيره نكردم خود عكس رو ذخيره كردم در ديتابيس

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:01 عصر
چرا آدرس تصویر را در پایگاه داده ذخیره نمی کنید ؟
دوست عزيز دوست دارم ادرس عكس رو ذخيره كنم اما نتونستم يكي دو تا كد هم ديدم اما سر در نياوردم چيكار كنم مثل شما استاد نيستيم كه :چشمک::لبخندساده:
دليل اينكه عكس ديده نمي شه چيه دوست عزيز؟

شما مي تونيد با كد هاي ساده نحوه ذخيره كردن ادرس عكس رو در ديتابيس و نمايش اون بهم ياد بدين؟

Peyman.Gh
یک شنبه 20 تیر 1389, 12:10 عصر
از Visual Studio 2005 استفاده میکنید ؟

یک فیلد برای آدرس تصویر در نظر بگیرید که آدرس نسبی تصویر در آن ذخیره شود.
بطور مثال رشته ای مانند کد زیر در آن فیلد ذخیره شود.
"~/image/" + FileUpload1.FileName

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:12 عصر
از Visual Studio 2005 استفاده میکنید ؟

یک فیلد برای آدرس تصویر در نظر بگیرید که آدرس نسبی تصویر در آن ذخیره شود.
بطور مثال رشته ای مانند کد زیر در آن فیلد ذخیره شود.
"~/image/" + FileUpload1.FileName
دوست عزيز به ويژوال استديو 2008 كوچ كردم اما اس كيو ال 2005 كار ميكنم
پس براي ذخيره عكس مي نويسم


FileUpload1.SaveAs("~/image/" + FileUpload1.FileName);

بعد مسئله اينه كه عكس هامون خيلي كمه حداكثر 5 تا عكس مي خوام ذخيره كنم فكر نكنم فشار زيادي به ديتابيس بياره
نمي دونيد چطور بايد نمايش داد عكسو در گريد ويو يا كنترل ديگر؟

Peyman.Gh
یک شنبه 20 تیر 1389, 12:21 عصر
من به شما Linq To Sql را پیشنهاد میکنم.
ولی در هر صورت زمانی که شما آدرس نسبی تصویر را ذخیره کردید خیلی راحت در یکی از کنترل ها مانند GridView میتوانید آن را نمایش دهید.


<asp:Image ID="Image1" runat="server"
ImageUrl='<%# Eval("image") %>' />

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:25 عصر
من به شما Linq To Sql را پیشنهاد میکنم.
ولی در هر صورت زمانی که شما آدرس نسبی تصویر را ذخیره کردید خیلی راحت در یکی از کنترل ها مانند GridView میتوانید آن را نمایش دهید.


<asp:Image ID="Image1" runat="server"
ImageUrl='<%# Eval("image") %>' />
ممنون دوست عزيز از كد بالا هم استفاده كردم اما باز به جاي عكس ضربدر نشون ميده؟ همه كارها صحيحه نميدونم چرا اينطوري ميشه:ناراحت:

Peyman.Gh
یک شنبه 20 تیر 1389, 12:34 عصر
دریکی از رکورد های فیلد مربوط به تصویر چه مقداری ذخیره شده است ؟

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:41 عصر
دریکی از رکورد های فیلد مربوط به تصویر چه مقداری ذخیره شده است ؟
من واستون پروژه اي كه ساختمو مي زارم دانلود كنيد اين طوري فكر كنم بهتر مي تونيد راهنمايي بكنيد
ديتابي براي اينكه حجم زياد نشه نزاشتم يك ديتابيس به نام test ايجاد كردم 2 تا فيلد داره
يكي pic و ديگري comment نوع pic از image هست ,comment از nvarchar

Peyman.Gh
یک شنبه 20 تیر 1389, 12:51 عصر
آیا دوست عزیز شما میتوانید یک رشته را در پایگاه داده ذخیره کنید ؟
زمانی که شما Button مربوط به ثبت را کلیک میکنید عکس مربوط را ذخیره میکنید در پروژه نه در پایگاه داده !
در فیلد مربوط به تصویر بطور مثال چنین رشته ای ذخیره میشود :

~/image/test.jpg

mehdi.mousavi
یک شنبه 20 تیر 1389, 12:52 عصر
سلام من به وسيله كد زير عكس رو در ديتابيس + يك توضيح ذخيري ميكنم


int len = FileUpload1.PostedFile.ContentLength;
byte[] pic = newbyte[len];
FileUpload1.PostedFile.InputStream.Read(pic, 0, len);
//
SqlConnection connection = newSqlConnection();
connection.ConnectionString = @"data source=.\sqlexpress;initial catalog=test;integrated security=true;";
try
{
connection.Open();
SqlCommand cmd = newSqlCommand("insert into table1 "
+ "(Pic, Comment) values (@pic, @text)", connection);
cmd.Parameters.Add("@pic", pic);
cmd.Parameters.Add("@text", TextBox1.Text);
cmd.ExecuteNonQuery();
}
finally
{
connection.Close();
}
اگه ميشه در مورد سه خط اول يه توضيح بدين ممنون ميشم

حال اومد يك گريد ويو و sqldatasource در صفحه قرار دادم

و گريد ويو رو به صورت زير تغيير دادم اما به جاي عكس ضرب در ديده ميشه اما متن(توضيح عكس) ديده ميشه دليل اينكه عكس ديده نمي شه چيه؟


<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"
DataSourceID="SqlDataSource1"Height="133px"Width="216px">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageID="Image1"runat="server"Height="42px"
ImageUrl='<%# Eval("pic") %>'Width="60px"/>
<asp:LabelID="Label1"runat="server"Text='<%# Eval("comment") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>


سلام.
طبیعی هستش که اینکار بهتون جواب نمیده. شما داده های یه تصویر رو در بانک ذخیره کرده اید، بنابراین نمی تونید (و نباید) این داده ها رو در ImageUrl بمنظور نمایش تصویر قرار بدید. برای اینکار، باید یه ASPX جدید بسازید، توی QueryString (و هنگام درخواست) ID ی مورد نظر تصویر در بانک رو به این ASPX پاس کنید، تا این ASPX، اون دادهای Binary رو با ContentType مناسب به Client برگردونه. بدین ترتیب تصویر مورد نظر به درستی Load خواهد شد.

برای اینکه با نحوه انجام اینکار آشنا بشید، لطفا این مقاله (http://www.4guysfromrolla.com/articles/120606-1.aspx) از Scott Mitchell رو مطالعه کنید که در اون جزییات و بخوبی توضیح داده...

موفق باشید.

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:55 عصر
آیا دوست عزیز شما میتوانید یک رشته را در پایگاه داده ذخیره کنید ؟
زمانی که شما Button مربوط به ثبت را کلیک میکنید عکس مربوط را ذخیره میکنید در پروژه نه در پایگاه داده !
در فیلد مربوط به تصویر بطور مثال چنین رشته ای ذخیره میشود :

~/image/test.jpg
دوست عزيز اطلاعات من با موفقيعت در ديتابيس ذخيره ميشه حتي زماني كه گريد ويو رو به sqldatasource وصل مي كنم و بر روي configuration datasource كليك مي كنم و تا اخر پيش مي رم بر روي test query كليك مي كمك عكسمو ميبينم
در ضمن من با پوشه image كار نمي كنم همونطور كه گفتم عكسمو مستقيم در ديتابيس ذخيره مي كنم و test هم اسم ديتابيس منه

mohsen.nsb44
یک شنبه 20 تیر 1389, 12:59 عصر
سلام.
طبیعی هستش که اینکار بهتون جواب نمیده. شما داده های یه تصویر رو در بانک ذخیره کرده اید، بنابراین نمی تونید (و نباید) این داده ها رو در ImageUrl بمنظور نمایش تصویر قرار بدید. برای اینکار، باید یه ASPX جدید بسازید، توی QueryString (و هنگام درخواست) ID ی مورد نظر تصویر در بانک رو به این ASPX پاس کنید، تا این ASPX، اون دادهای Binary رو با ContentType مناسب به Client برگردونه. بدین ترتیب تصویر مورد نظر به درستی Load خواهد شد.

برای اینکه با نحوه انجام اینکار آشنا بشید، لطفا این مقاله (http://www.4guysfromrolla.com/articles/120606-1.aspx) از Scott Mitchell رو مطالعه کنید که در اون جزییات و بخوبی توضیح داده...

موفق باشید.
دوست عزيز منبع فارسي هم در اين ضمينه دارين معرفي بكنيد؟؟؟؟

mohsen.nsb44
یک شنبه 20 تیر 1389, 13:13 عصر
تو يه مقاله براي نمايش عكس از كد زير استفاده كرده بود ميشه يكمي در موردش توضيح بدين




چگونه می توانم یک تصویر را از دیتابیس خوانده و در صفحه وب نمایش دهم؟


اینجا من از یک صفحه وب برای نمایش تصویر استفاده کرده ام، کد زیر برای نمایش تصویر در صفحه وب استفاده می شود



private void Page_Load(object sender, System.EventArgs e)

{
MemoryStream stream = new MemoryStream ();
SqlConnection connection = new
SqlConnection (@"server=127.0.0.1;database=MyData;uid=sa;pwd=yourpa ss");
try
{
connection.Open ();
SqlCommand command = new
SqlCommand ("select Picture from Image", connection);
byte[] image = (byte[]) command.ExecuteScalar ();
stream.Write (image, 0, image.Length);
Bitmap bitmap = new Bitmap (stream);
Response.ContentType = "image/gif";
bitmap.Save (Response.OutputStream, ImageFormat.Gif);
}
finally
{
connection.Close ();
stream.Close ();
}
}





زماني كه از اين كد استفاده مي كنم اين خطو ارور مي گيره
MemoryStream stream = new MemoryStream();

Peyman.Gh
یک شنبه 20 تیر 1389, 13:32 عصر
System.IO را به پروژه اضافه کردید؟

mehdi.mousavi
یک شنبه 20 تیر 1389, 15:44 عصر
دوست عزيز منبع فارسي هم در اين ضمينه دارين معرفي بكنيد؟؟؟؟

خیر متاسفانه...

mohsen.nsb44
دوشنبه 21 تیر 1389, 10:53 صبح
System.IO را به پروژه اضافه کردید؟
بله اضافه كردم

mehdi.mousavi
دوشنبه 21 تیر 1389, 10:59 صبح
سلام.
پیام خطایی که میگیرید چی هستش؟ (هنگام استفاده از MemoryStream).

موفق باشید.

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

mohsen.nsb44
دوشنبه 21 تیر 1389, 12:09 عصر
سلام.
پیام خطایی که میگیرید چی هستش؟ (هنگام استفاده از MemoryStream).

موفق باشید.

پاورقی: لطفا اینو از این به بعد خودتون بطور پیش فرض ذکر کنید. من اصلا علاقه ای ندارم هر چند پست یه بار اینو بپرسم. وقتی خودتون میگید "خطا میگیره"، لطفا اطلاعاتی بدید که به پیدا کردن خطا به ما کمک کنه. و الا عبارت "خطا میگیره" اینقدر کلی هستش که.... بنابراین از این پس لطفا به این مساله توجه ویژه ای داشته باشید.
دوست عزيز هيچ متن خطايي نمي داد فقط همون خط رو به صورت قرمز نمايش مي داد مشكلش هم اين بود كه system.io رو اضافه نكرده بودم بعد از اظافه كردن درست شد اما مشكل اينجاست كه عكسو در صفحه نمايش مي ده من مي خوام در گريد ويو نمايش بدم

mohsen.nsb44
سه شنبه 22 تیر 1389, 11:45 صبح
لطفا یکی از دوستان راهنمایی کنه چطور میتونم با کد هایی که بالا نوشتم عکسی که در دیتابیس ذخیره کردمو در گرید ویو نشون بدم لطفا کمک کنید نیاز دارم

profnami
سه شنبه 22 تیر 1389, 12:11 عصر
ببینید دوست عزیز شما فقط اسم عکس رو در DB ذخیره کنید . با این کد هم خود عکس رو درون یک پوشه ذخیره کنید :

FileUpload1.SaveAs(Server.MapPath("~/testPages/") + FileUpload1.FileName);
مسیر رو خودتون تعیین کنید . برای بایند کردن هم به این صورت عکس رو داخل Grid بایند کنید :

ImageUrl='<%# Eval("NewsImage","~/testPages/{0}") %>'
من متوجه نشدم MemoryStream برای چیه ؟

mohsen.nsb44
سه شنبه 22 تیر 1389, 12:21 عصر
دوست عزیز با کد زیر عکس در پوشه image ذخیره می شود
fileupload1.saveas("~/image/"+fileupload1.filename
حال برای اینکه اسمش در دیتابیس ذخیره شود چکار باید کرد؟

profnami
سه شنبه 22 تیر 1389, 13:27 عصر
مومن این چه سوالیه . خوب وقتی اسم فایل رو داری با یه دستور Insert میتونی درجش کنی دیگه . fileUpload1.filename رو توی یک فیلد درج کن

mohsen.nsb44
چهارشنبه 23 تیر 1389, 09:41 صبح
مومن این چه سوالیه . خوب وقتی اسم فایل رو داری با یه دستور Insert میتونی درجش کنی دیگه . fileUpload1.filename رو توی یک فیلد درج کن
اوکی چطوری تو گریدویو فراخوانی بکنم؟

Peyman.Gh
چهارشنبه 23 تیر 1389, 10:14 صبح
شما آدرس نسبی فایل را در پایگاه داده ذخیره میکنید بطور مثال :

~/image/test.jpg
میتوانید یک ImageField اضافه کنید و به فیلد مورد نظر متصل کنید :
http://barnamenevis.org/forum/attachment.php?attachmentid=52877&stc=1&d=1279088070

موفق باشید.

mohsen.nsb44
چهارشنبه 23 تیر 1389, 11:00 صبح
دوستان عزیز از راهنماییتون ممنون مشکلم حل شد.
حال اگه بخوام عکس هایی که اپلود می کنم سایز همشون مثلا طور 20 عرض 15 باشه چکار باید بکنم؟

Peyman.Gh
چهارشنبه 23 تیر 1389, 11:06 صبح
در Propertiesا،ImageField میتوانید Width , Height را مشخص کنید که تصاویر از اندازه ای که شما تعیین کرده اید بزرگتر نشان داده نشوند.

موفق باشید.

mohsen.nsb44
چهارشنبه 23 تیر 1389, 11:41 صبح
در Propertiesا،ImageField میتوانید Width , Height را مشخص کنید که تصاویر از اندازه ای که شما تعیین کرده اید بزرگتر نشان داده نشوند.

موفق باشید.
دوست عزیز یه سوال جدید واسم پیش اومد اگه بخوام عکس رو از پوشه و نام عکس رو از دیتابیس پاک کنم چیکار باید بکنم
اینم خدمت شما بگم که من image field در گرید ویو اضافه نکردم بلکه در قسمت tempalete یک image گذاشتم و بایند کردم

کد:
ImageUrl='<%# Eval("NewsImage","~/testPages/{0}") %>'
حال برای حذف یک عکس مورد نظر از پوشه و دیتابیس چه باید کرد؟

Peyman.Gh
چهارشنبه 23 تیر 1389, 12:22 عصر
تصویر مورد نظر را به این صورت حذف کنید :
System.IO.File.Delete(string path);
و آدرس نسبی آن را در Database یا خالی کنید یا کل سطر را حذف کنید.

mohsen.nsb44
چهارشنبه 23 تیر 1389, 12:59 عصر
تصویر مورد نظر را به این صورت حذف کنید :
System.IO.File.Delete(string path);
و آدرس نسبی آن را در Database یا خالی کنید یا کل سطر را حذف کنید.
دوست عزیز من می خوام یک تکست باکس داشته باشم که زمانی داخلش اسم عکسو می نویسم و دکمه حذف رو می زنم فقط همون عکس از پوشه . خب حالا در کد شما به جای path باید بنویسم ~/image/????
به جای علامت سوال چی باید بنویسم که متن داخل تکست باکس اگه برابر با نام عکس شد عمل بکنه؟

Peyman.Gh
چهارشنبه 23 تیر 1389, 13:05 عصر
دوست عزیز من می خوام یک تکست باکس داشته باشم که زمانی داخلش اسم عکسو می نویسم و دکمه حذف رو می زنم فقط همون عکس از پوشه . خب حالا در کد شما به جای path باید بنویسم ~/image/????
به جای علامت سوال چی باید بنویسم که متن داخل تکست باکس اگه برابر با نام عکس شد عمل بکنه؟
protected void Delete_Click(object sender, EventArgs e)
{
System.IO.File.Delete(Server.MapPath("~/image/") + TextBox1.Text);
}