PDA

View Full Version : مشکل: عدم نمایش تصاویر ذخیره شده در دیتابیس



fereshte22
یک شنبه 17 تیر 1386, 10:14 صبح
سلام
اول از مدیر محترم خواهش میکنم تاپیک بنده را حذف نکنند.من خیلی وقته که درگیر این مشکل هستم و متاسفانه حل نشده.به خاطر همین تصمیم گرفتم در این تاپیک شرحی از کارهای انجام شده را بنویسم تا دوستان بهتر بتوانند کمک کنند.
(من میخواهم خصوصیات تبلیغات در سایت را تنظیم کنم از قبیل اندازه تصاویر و تعداد کلیک و لینک به صفحه مورد نظر و غیره)

من از کد زیر برای ذخیره تصویر استفاده کردم



Dim id AsInteger
id = textbox1.text
' Create a byte[] from the input file
Dim len AsInteger = FileUpload1.PostedFile.ContentLength
Dim pic() AsByte = NewByte(len) {}
FileUpload1.PostedFile.InputStream.Read(pic, 0, len)
' Insert the image and comment into the database
Dim connection AsNew SqlConnection(ConfigurationManager.ConnectionStrin gs("ssgshopConnectionString").ConnectionString)
Try
connection.Open()
Dim cmd As SqlCommand
cmd = New SqlCommand("insert into tablighat " + "(Picture, Commen,PicId) values (@pic, @text,@picId)", connection)

cmd.Parameters.Add("@pic", pic)
cmd.Parameters.Add("@text", "Your Comment")
cmd.Parameters.Add("@picId", id)
cmd.ExecuteNonQuery()
Finally
connection.Close()
EndTry


برای بازیابی تصویر نیز از کد زیر استفاده کردم(در صفحه retriveimage.aspx)


PrivateSub Page_Load(ByVal sender AsObject, ByVal e As System.EventArgs)
' Put user code to initialize the page here
Dim id AsString
id = Request.QueryString("id")
Dim stream As MemoryStream = New MemoryStream()
Dim connection AsNew SqlConnection(ConfigurationManager.ConnectionStrin gs("ssgshopConnectionString").ConnectionString)
Try
connection.Open()
Dim command As SqlCommand

command = New SqlCommand("select Picture from tablighat where picid=" + 1, connection)
Dim image() AsByte = CType(Command.ExecuteScalar(), Byte())
stream.Write(image, 0, image.Length)
Dim bitmap As bitmap = New Bitmap(stream)
Response.ContentType = "image/jpeg"
bitmap.Save(Response.OutputStream, ImageFormat.Jpeg)
Finally
connection.Close()
stream.Close()
EndTry

EndSub


بعد در یک usercontrol از کد زیر استفاده کردم


Inherits System.Web.UI.UserControl
Dim _id AsString
PublicProperty AdvertisId() AsString
Get
ReturnMe._id
EndGet
Set(ByVal value AsString)
Me._id = value
Call FillInfo()
EndSet
EndProperty
PublicSub FillInfo()
Image1.ImageUrl = "D:/Documents and Settings/fereshte/My Documents/Visual Studio 2005/shop/reteriveimage.aspx?id=" + (Me._id)
EndSub

ودر صفحه ای دیگر برای نمایش تصاویر یک گریدویو قرار دادم وگرید ویو را با usercontrol پر کردم.



<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"DataSourceID="SqlDataSource1">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<uc1:tablighatID="Tablighat1"runat="server"advertisID="<% Eval('picid') %>"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

خواهش میکنم دوستان یه نگاهی به این کد بندازند و به من کمک کنند که بدونم مشکل کار چیه؟
چرا هیچ تصویری نمایش داده نمیشود.؟
در ضمن اگر دوستان پیشنهادی در مورد تنظیم تبلیغات در سایت دارند ممنون میشوم راهنمایی کنند.

Alireza_Salehi
یک شنبه 17 تیر 1386, 11:35 صبح
به جای این کد

Image1.ImageUrl = "D:/Documents and Settings/fereshte/My Documents/Visual Studio 2005/shop/reteriveimage.aspx?id=" + (Me._id)

از این استفاده کنید:


Image1.ImageUrl = "~/shop/reteriveimage.aspx?id=" + (Me._id)

fereshte22
یک شنبه 17 تیر 1386, 13:36 عصر
عذر میخواهم ولی بازهم چیزی نمایش داده نمیشود.اگه لطف کنید در همین مورد و همچنین مشکلات دیگری(قابل تنظیم بودن و...) که در بالا بیان کردم کمک کنید خیلی ممنون میشوم

Alireza_Salehi
یک شنبه 17 تیر 1386, 15:39 عصر
عذر میخواهم ولی بازهم چیزی نمایش داده نمیشود.اگه لطف کنید در همین مورد و همچنین مشکلات دیگری(قابل تنظیم بودن و...) که در بالا بیان کردم کمک کنید خیلی ممنون میشوم

در UserControl به جای استفاده از رویداد Load برای انجام کد زیر


Image1.ImageUrl = "~/shop/reteriveimage.aspx?id=" + (Me._id)

از رویدادهای DataBinding یا PreRender استفاده کنید.

در ضمن در خط 11 کد بازیابی تصویر یه دونه 1 هست اون رو هم تصحیح کن- تا تصویر صحیح انتخاب بشه.

command = New SqlCommand("select Picture from tablighat where picid=" + 1, connection)

این قسمت رو هم :

advertisID="<% Eval('picid') %>"
اینطوری بنویس:

advertisID='<%# Eval("picid") %>''

fereshte22
یک شنبه 17 تیر 1386, 19:55 عصر
سلام
میشه لطف کنید و در این مورد میشه توضیح دهید


در UserControl به جای استفاده از رویداد Load برای انجام کد زیر

کد:
Image1.ImageUrl = "~/shop/reteriveimage.aspx?id=" + (Me._id)
از رویدادهای DataBinding یا PreRender استفاده کنید.


در ضمن من فایل برنامه را قرار دادم اگه نگاهی به اون بندازید خیلی ممنون میشوم.

Alireza_Salehi
دوشنبه 18 تیر 1386, 12:08 عصر
این که کار میکنه !

فقط این


Image1.ImageUrl = "~/shop/reteriveimage.aspx?id=" + (Me._id)

رو به این


Image1.ImageUrl = "~/retriveimage.aspx?id=" + (Me._id)

تبدیل کردم کار کرد!

احتمالا از اولش هم مشکل تایپی بوده!

fereshte22
دوشنبه 18 تیر 1386, 15:37 عصر
سلامراستش خیلی تعجب میکنم چرا من که اجرا میکنم در گرید ویو کنترل image خالی است.؟!!!!!!در ضمن همون طور که قبلا هم گفتم من میخواهم تعداد کلیک روی تصویر را داشته باشم و اون را update کنم .در ضمن وقتی تصاویر را اضافه میکنم ارتفاع و پهنای اون را مشخص کنم و بر اساس این اندازه تصاویر را اضافه کنم.میشه در این مورد هم من را راهنمایی کنید.(با توجه به روند کار)

Alireza_Salehi
دوشنبه 18 تیر 1386, 21:35 عصر
این که چرا نشون نمیده !!؟ چک کن ببین اشتباه تایپی چیزی نداشته باشی چون به طور کلی کدی که گذاشتی سالمه.

برای ثبت کلیکها هم به جای Image از ImageButton استفاده کن قابلیت کلیک داره! بعد با خاصیتهای CommandName و CommandArgument و رویداد RowCommand مربوط به گریدویو کلیک ها رو کنترل کن و هر جا خواستی ثبت کن.(جستجو کن مثالش هست)

برای اندازه هم همون طور که ID رو پاس میدی Hight و Width رو هم پاس بده بعد همون جایی که می خوای عکس رو به Response اضافه کنی با متد GetThumbnaleImage مربوط به کلاس Bitmap اندازش رو تغییر بده.

fereshte22
سه شنبه 19 تیر 1386, 11:41 صبح
سلام
راستش این مشکل من هنوز حل نشده.کدها را هم چک کردم..میتونم بپرسم ایا شما خود برنامه ای را که گذاشتم چک کردید و یا از روی کدهامیفرمایید که مشکلی ندارد.
اگه خود برنامه را چک کنید واقعا ممنون میشوم.در مورد تعداد کلیک من در انجمن جستجو کردم و چیزی که پیداکردم این بود که برای imagebutton به صورت زیر عمل کنم.


<asp:ImageButtonID="ImageButton1"runat="server"CommandName="button"CommandArgument='<%#EVAL("picid") %>'/>

وکد زیر را استفاده کنم.


ProtectedSub GridView1_RowCommand(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs ) Handles GridView1.RowCommand
If e.CommandName = "button"Then
'some code
EndIf
EndSub

ولی من چیزی در این مورد که بعد از تشخیص کلیک تعداد ان را برای هر سطر چگونه شمارش و ثبت کنم پیدا نکردم.
در مورد کلیک بر روی تصویر و لینک به سایت دیگر ایا درسته که به این صورت عمل کنیم.
در روال rowcommand از کد زیر استفاده کنیم


Response.Redirect(ur)

حالا با توجه به اینکه ادرس لینک برای هر تصویر در دیتابیس ذخیره شده این مقدار را استخراج کنیم و به جای مقدار ur قرار دهیم؟و یا روش دیگری وجود دارد؟
ممنون میشوم که راهنمایی کنید

Alireza_Salehi
سه شنبه 19 تیر 1386, 17:05 عصر
برنامه شما رو تست کردم و جواب داد!

برای کلیک هم همین که نوشتید درسته ، کافیه توی RowCommand بوسیله e.CommandArgument مقدار id رو که پاس دادید بگیرید و در دیتابیس مثلا مقدار یک فیلد رو یک واحد افزایش بدید.

برای آدرس این کار که گفتید رو هم میشه کرد ولی میتونید همون موقع که دارید عکس ر اود می کنید آدرس رو هم با یک پارامتر دیگه پاس بدید تا دیگه نخواد دوباره موقع کلیک دیتابیس رو بخونید.

fereshte22
چهارشنبه 20 تیر 1386, 12:55 عصر
سلام
با راهنمایهای شما مشکل تعداد کلیک و لینک حل شد.الان مشکل بعدیه من در ارتباط با سایز عکس است.من با توجه به مطالب موجود در سایت از کد زیر برای تنظیم اندازه عکس استفاده کردم.
البته کد سی شارپ به صورت زیر بود.(صفحه MakeThumbnail.aspx)


protectedvoid Page_Load(object sender, System.EventArgs e)
{
// get the file name -- fall800.jpg
string file = Request.QueryString["file"];
// create an image object, using the filename we just retrieved
System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath(file) );
// create the actual thumbnail image
System.Drawing.Image thumbnailImage = image.GetThumbnailImage(100, 64, new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback), IntPtr.Zero);

// make a memory stream to work with the image bytes
MemoryStream imageStream = newMemoryStream();
// put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// make byte array the same size as the image
byte[] imageContent = newByte[imageStream.Length];
// rewind the memory stream
imageStream.Position = 0;
// load the byte array with the image
imageStream.Read(imageContent, 0, (int)imageStream.Length);
// return byte array to caller with image type
Response.ContentType = "image/jpeg";
Response.BinaryWrite(imageContent);
}
///<summary>
/// Required, but not used
///</summary>
///<returns>true</returns>
publicbool ThumbnailCallback()
{
returntrue;
}

که اون را به vb تبدیل کردم


ProtectedSub Page_Load(ByVal sender AsObject, ByVal e As System.EventArgs)
' get the file name -- fall800.jpg
Dim file AsString = Request.QueryString("file")
' create an image object, using the filename we just retrieved
Dim image As System.Drawing.Image = System.Drawing.Image.FromFile(Server.MapPath(file) )
' create the actual thumbnail image
Dim thumbnailImage As System.Drawing.Image = image.GetThumbnailImage(64, 64, New System.Drawing.Image.GetThumbnailImageAbort(Addres sOf ThumbnailCallback), IntPtr.Zero)
' make a memory stream to work with the image bytes
Dim imageStream As MemoryStream = New MemoryStream()
' put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg)
' make byte array the same size as the image
Dim imageContent() AsByte = NewByte(imageStream.Length) {}
' rewind the memory stream
imageStream.Position = 0
' load the byte array with the image
imageStream.Read(imageContent, 0, CType(imageStream.Length, Integer))
' return byte array to caller with image type
Response.ContentType = "image/jpeg"
Response.BinaryWrite(imageContent)
EndSub
PublicFunction ThumbnailCallback() AsBoolean
ReturnTrue
EndFunction

ودر صفحه Thumbnail.aspx کد زیر برای نمایش تصویر استفاده شده:


<asp:Imageid="Image1"runat="server"ImageUrl="MakeThumbnail.aspx?file=pic.jpg"/>

حالا مشکلی دارم اینه که کد سی شارپ کار میکند(البته نمیدونم چرا بعضی مواقع خطا میگیرد و اجرا نمیشود.)ولی کد vb خطا نمیگیرد ولی تصویری هم نمایش نمیدهد.
در ضمن مشکل دیگرم اینه که این کد را چطور استفاده کنم؟
البته شما در پستهای قبلی در این مورد توضیح دادید ولی نمیدونم دقیقا کدها را به چه صورت استفاده کنم و با کدهای صفحه retriveimage.aspx ترکیب کنم ؟

Alireza_Salehi
چهارشنبه 20 تیر 1386, 17:38 عصر
سلام
با راهنمایهای شما مشکل تعداد کلیک و لینک حل شد.الان مشکل بعدیه من در ارتباط با سایز عکس است.من با توجه به مطالب موجود در سایت از کد زیر برای تنظیم اندازه عکس استفاده کردم.
البته کد سی شارپ به صورت زیر بود.(صفحه MakeThumbnail.aspx)


protectedvoid Page_Load(object sender, System.EventArgs e)
{
// get the file name -- fall800.jpg
string file = Request.QueryString["file"];
// create an image object, using the filename we just retrieved
System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath(file) );
// create the actual thumbnail image
System.Drawing.Image thumbnailImage = image.GetThumbnailImage(100, 64, new System.Drawing.Image.GetThumbnailImageAbort(Thumbn ailCallback), IntPtr.Zero);

// make a memory stream to work with the image bytes
MemoryStream imageStream = newMemoryStream();
// put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// make byte array the same size as the image
byte[] imageContent = newByte[imageStream.Length];
// rewind the memory stream
imageStream.Position = 0;
// load the byte array with the image
imageStream.Read(imageContent, 0, (int)imageStream.Length);
// return byte array to caller with image type
Response.ContentType = "image/jpeg";
Response.BinaryWrite(imageContent);
}
///<summary>
/// Required, but not used
///</summary>
///<returns>true</returns>
publicbool ThumbnailCallback()
{
returntrue;
}

که اون را به vb تبدیل کردم


ProtectedSub Page_Load(ByVal sender AsObject, ByVal e As System.EventArgs)
' get the file name -- fall800.jpg
Dim file AsString = Request.QueryString("file")
' create an image object, using the filename we just retrieved
Dim image As System.Drawing.Image = System.Drawing.Image.FromFile(Server.MapPath(file) )
' create the actual thumbnail image
Dim thumbnailImage As System.Drawing.Image = image.GetThumbnailImage(64, 64, New System.Drawing.Image.GetThumbnailImageAbort(Addres sOf ThumbnailCallback), IntPtr.Zero)
' make a memory stream to work with the image bytes
Dim imageStream As MemoryStream = New MemoryStream()
' put the image into the memory stream
thumbnailImage.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg)
' make byte array the same size as the image
Dim imageContent() AsByte = NewByte(imageStream.Length) {}
' rewind the memory stream
imageStream.Position = 0
' load the byte array with the image
imageStream.Read(imageContent, 0, CType(imageStream.Length, Integer))
' return byte array to caller with image type
Response.ContentType = "image/jpeg"
Response.BinaryWrite(imageContent)
EndSub
PublicFunction ThumbnailCallback() AsBoolean
ReturnTrue
EndFunction

ودر صفحه Thumbnail.aspx کد زیر برای نمایش تصویر استفاده شده:


<asp:Imageid="Image1"runat="server"ImageUrl="MakeThumbnail.aspx?file=pic.jpg"/>

حالا مشکلی دارم اینه که کد سی شارپ کار میکند(البته نمیدونم چرا بعضی مواقع خطا میگیرد و اجرا نمیشود.)ولی کد vb خطا نمیگیرد ولی تصویری هم نمایش نمیدهد.
در ضمن مشکل دیگرم اینه که این کد را چطور استفاده کنم؟
البته شما در پستهای قبلی در این مورد توضیح دادید ولی نمیدونم دقیقا کدها را به چه صورت استفاده کنم و با کدهای صفحه retriveimage.aspx ترکیب کنم ؟

اصلا لازم نبود یک صفحه جدید ایجاد کنید ، اگر صرفا می خواهید تصویر را کوچک کنید داخل همون کد قبلی یک خط اضافه کنید که با متد GetThumbnaleImage تصویر رو کوچیک کنه ، طول و عرض رو هم یا استاتیک تعریف کنید یا مثل همون ID تصویر با تعریف Properties از طریق QuerString ارسال کنید.

همون کد قبلی رو اصلاح کنید بهتره.

fereshte22
پنج شنبه 21 تیر 1386, 11:50 صبح
سلام
اقای صالحی من که دیگه دارم دیوانه میشوم..از یک طرف شما میفرمایید که برنامه مشکلی ندارد و از طرف دیگر من که اجرا میکنم ستون image در گریدویو خالی است.من امروز برنامه را روی دوتا سیستم دیگر هم امتحان کردم ولی جوابی نگرفتم.
جسارتا میتونم از شما درخواست برنامه ای که اجرا میکنید با هر تغییری که در برنامه من اعمال میکنید(هر چند جزیی )اینجا قرار دهید .راستش دیگه راه حلی به ذهنم نمیرسد.

egoldashraf
پنج شنبه 22 اسفند 1387, 03:58 صبح
پروژه شما کار میکنه. البته کمی هم تغییر دادم! در مورد سایز عکس هم باید وجود و سایز مناسب رو هنگام ثبت اطلاعات تبلیغ چک کنید و بعد در دیتا بیس ذخیره کنید.