PDA

View Full Version : نمایش تصویر در جدول با فرمت var binary



WgsFahime
شنبه 24 تیر 1391, 11:31 صبح
دوستان عزیز سلام
چگونه می توانم یک تصویر که با فرمت varbinary که در جدول ذخیره شده است را نمایش داد؟

من یه برنامه دارم که یک فایل را از file uploaded از کاربر میگیره در جدولی که فیلد تصویر را از نوع varbinary در sql server ذخیره می کند

من میخوام این تصویر در صفحه ویرایش یا نمایش اطلاعات در یک گرید دیده شه اما آدرسی از مسیر ونام فایل ندارم
من میخوام تصویر از جدول خوانده و نمایش داده شه.
در ذخیره عکس مشکل نداشتم اما الان که میخوام عکس رو نمایش بدم مشکل دارم
البته برنامه من وب فرم است و نمی توانم از picturebox استفاده کنم لطفا راهنمایی نمایید با تشکر

alonemm
شنبه 24 تیر 1391, 12:17 عصر
باسلام:

خوب در قالب 1 یک پروژه جلو میریم.


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


<asp:GridView ID="GridView1" runat="server" EnableViewState="false"
AutoGenerateColumns="false">
<Columns>
<asp:BoundField HeaderText="AutoId" DataField="AutoId" />
<asp:BoundField HeaderText="File Name" DataField="FileName" />
<asp:TemplateField HeaderText="File">
<ItemTemplate>
<img src="ShowImage.ashx?autoId=<%# Eval("AutoId") %>" alt="<%#
Eval("FileName") %>" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="IsActive">
<ItemTemplate>
<%# Eval("Active").ToString().Equals("True") ? "Yes" : "No" %>
</ItemTemplate>
</asp:TemplateField>

</Columns>
</asp:GridView>



و در CODE BEHIND (فایل CS مربوط به وب فرم):


string _connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindFiles();
}
}

/// <summary>
/// Binds the files.
/// </summary>
private void BindFiles()
{
DataTable table = new DataTable();

// get the connection
using (SqlConnection conn = new SqlConnection(_connStr))
{
// write the sql statement to execute
string sql = "SELECT AutoId, FileName, FileContent, Active FROM Files Order
By AutoID ASC";
// instantiate the command object to fire
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// get the adapter object and attach the command object to it
using (SqlDataAdapter ad = new SqlDataAdapter(cmd))
{
// fire Fill method to fetch the data and fill into DataTable
ad.Fill(table);
}
// DataAdapter doesn't need open connection, it takes care of opening and
closing the database connection
}
}
GridView1.DataSource = table;
GridView1.DataBind();
}



و از یک فایل هندلر برای واکشی عکس ها از پایگاه داده و نمایش اون استفاده میکنیم: (ShowImage.ashx)

using System.Configuration;
using System.Data;
using System.Data.SqlClient;

public class ShowImage : IHttpHandler {

public void ProcessRequest (HttpContext context)
{
if (context.Request.QueryString["autoId"] == null) return;

string connStr = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
string autoId = context.Request.QueryString["autoId"];
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand("SELECT FileContent FROM Files WHERE
AutoID = @autoId", conn))
{
cmd.Parameters.Add(new SqlParameter("@autoId", autoId));
conn.Open();
using (SqlDataReader reader =
cmd.ExecuteReader(CommandBehavior.CloseConnection) )
{
reader.Read();

context.Response.BinaryWrite((Byte[])reader[reader.GetOrdinal("FileContent")]);
reader.Close();
}
}
}
}

public bool IsReusable {
get {
return true;
}
}
}



از پروژه خودتون لذت ببرید...!

http://www.dotnetfunda.com/UserFiles/ArticlesFiles/Sheonarayan_7755_2.JPG


دقت داشته باشید که کنترل Image توسط کد :

src="ShowImage.ashx?autoId=<%# Eval("AutoId") %>"

به هندلر مربوطه وصل شده و با ارسال AutoId عکس رو از پایگاه داده واکشی کرده و به نمایش در میاره.

nill_far
جمعه 10 مرداد 1393, 23:13 عصر
سلام . ببخشید من دو سه روز تمام اینچنین کدهایی که با هندلر برای نمایش تصویر هستن رو امتحان میکنم ولی اصلا تصویری نمایش داده نمیشه. کدم دقیقا مثل شماست ( با تغییراتی که در constring و نام جداول و querystring و غیره باید داده بشه)
وقتی فایل آپلود میشه داخل اون فیلد <binary data> نوشته میشه. درسته؟ منظورم اینه که با این نوشته مبتونم مطمئن شم که تصویری آپلود شده؟
خواهشا کمکم کنید. کلافه شدم :ناراحت:

royal93
جمعه 10 مرداد 1393, 23:55 عصر
سلام . ببخشید من دو سه روز تمام اینچنین کدهایی که با هندلر برای نمایش تصویر هستن رو امتحان میکنم ولی اصلا تصویری نمایش داده نمیشه. کدم دقیقا مثل شماست ( با تغییراتی که در constring و نام جداول و querystring و غیره باید داده بشه)
وقتی فایل آپلود میشه داخل اون فیلد <binary data> نوشته میشه. درسته؟ منظورم اینه که با این نوشته مبتونم مطمئن شم که تصویری آپلود شده؟
خواهشا کمکم کنید. کلافه شدم :ناراحت:


سلام . ببخشید من دو سه روز تمام اینچنین کدهایی که با هندلر برای نمایش تصویر هستن رو امتحان میکنم ولی اصلا تصویری نمایش داده نمیشه. کدم دقیقا مثل شماست ( با تغییراتی که در constring و نام جداول و querystring و غیره باید داده بشه)
وقتی فایل آپلود میشه داخل اون فیلد <binary data> نوشته میشه. درسته؟ منظورم اینه که با این نوشته مبتونم مطمئن شم که تصویری آپلود شده؟
خواهشا کمکم کنید. کلافه شدم :ناراحت:

شما یه گریدویو روی فرمت بذار هرجایی که میخای تصویر اونجا نشون داده بشه بعد اون مثلث گوشه بالا سمت چپش رو بزن بعد گزینه آخر یعنی Edit Template رو بزن حالا گریدویو شما تغییر شکل داده

الان باید از تولباکس یه کنترل Image بیاری و اون وسط گریدویو که نوشته Item Template بذاریش . خب حالا دوباره اون مثلت کوچیکه رو بزنید و گزینه end template editing رو انتخاب کنید .

کار تمومه حالا نوبت به کد نویسیه . تیکه کد زیر رو در رویداد فرم لود یا دکمه باتن مورد نظر بنویسید ...




(protected void Page_Load(object sender, EventArgs e
{


;("SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=University;Integrated Security=True


' "+ string query = "select * from name jadvali ke ax zakhire shode where ID=' " + Label1.text

;(SqlCommand cmd = new SqlCommand(query, con

;()con.Open

;()sqlDataReader dr = cmd.ExecuteReader
;GridView1.DataSource = dr
;()GridView1.DataBind

;()con.Close


}



}

alizl70
شنبه 11 مرداد 1393, 01:56 صبح
با سلام خدمت شما
کد هایی که می نویسم تست شده می باشند پس حتما باید برای شما جواب دهند.خب بریم سر اصل مطلب
هرچند که میدونم خودتون درج در پایگاه را بلدید ولی محض یادآوری دوباره روش درج را می نویسم.لازم به ذکر است که بنده از روش linq برای این کار استفاده کردم.
خب همون اول در پنجره Solution explorer روی اسم سایت کلیک راست کرده و یک آیتم جدید از نوع linq to sql ایجاد می کنیم.اسم پیش فرض را قبول می کنیم که به صورت پیش فرض باید DataClasses.dbml باشد.
خب الان دیتابیس رو به برنامه وصل کرده و از پنجره Server explorer جدول را در کلاس linq درگ و دراپ نمایید.
خب فرض کنیم جدول ما به اسم w است و دو فیلد به صورت زیر دارد

121877

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


protected void Button1_Click(object sender, EventArgs e)
{
Byte[] bytes = null;
if (FileUpload1.HasFile)
{
MemoryStream ms = new MemoryStream(FileUpload1.FileBytes);
BinaryReader br = new BinaryReader(ms);
bytes = br.ReadBytes((int)ms.Length);
DataClassesDataContext db = new DataClassesDataContext();
db.ws.InsertOnSubmit(new w {image=bytes});
db.SubmitChanges();
}
}



حالا یک handler ایجاد کرده و کد زیر را درآن می نویسم:



using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
DataClassesDataContext db = new DataClassesDataContext();
context.Response.ContentType = "image/jpg";
var ir = db.ws.FirstOrDefault(i => i.id == int.Parse(context.Request.QueryString["imgID"]));
context.Response.BinaryWrite(ir.image.ToArray());
}

public bool IsReusable {
get {
return false;
}
}


}



حال تگ image را به صورت زیر می نویسیم:


<asp:Image ID="Image1" runat="server" ImageUrl="~/Handler.ashx/?imgID=1" CssClass="img"/>

خروجی:
121879
در آخر هم بگم اگه که ارتباط شما با دیتابیس ado.net است می توانید به لینک زیر مراجعه فرمایید:
http://www.dotnetfox.com/articles/store-and-retrieve-image-from-database-in-Asp-Net-1113.aspx

nill_far
سه شنبه 14 مرداد 1393, 19:05 عصر
ممنون. ولی من همه این کارها رو کردم. بقیه اطلاعات اون رکورد رو میخونه. مثل سایز عکس یا نام کاربری که اونو آپلود کرده. ولی همچنان تصویری نمایش داده نمیشه.
من یه گریدویو دارم که دیتاسورس داره . جزئیات رو ضمیمه کردم. (http://www.mediafire.com/view/c6sj5s513ck4c3n/Untitled.jpg)

ممنون بخاطر راهنماییهاتون :ناراحت:

royal93
سه شنبه 14 مرداد 1393, 23:39 عصر
سورس برنامتون رو بذارید تا مشکلش رو حل کنیم

nill_far
جمعه 17 مرداد 1393, 13:14 عصر
ببخشید/
این هم SOURCE (http://www.mediafire.com/view/j20y9ris4wgxp6j/)
خیلی ممنون.

Alireza_Salehi
دوشنبه 20 مرداد 1393, 08:25 صبح
context.Response.ContentType = "image/png";
در کد هندلر باید چیزی شبیه مورد فوق وجود داشته باشد.

البته می تونید با firebug یا ابزار مشابه تست کنید نتیجه request عکس چه چیزی بر میگردونه.

royal93
سه شنبه 21 مرداد 1393, 09:48 صبح
این دو فایل رو که ضمیمه کردم نگاه کنید . تمام کارهای لازم داخلش هست امیدوارم مشکلتون حل بشه

alizl70
جمعه 28 شهریور 1393, 19:00 عصر
ممنون. ولی من همه این کارها رو کردم. بقیه اطلاعات اون رکورد رو میخونه. مثل سایز عکس یا نام کاربری که اونو آپلود کرده. ولی همچنان تصویری نمایش داده نمیشه.
من یه گریدویو دارم که دیتاسورس داره . جزئیات رو ضمیمه کردم. (http://www.mediafire.com/view/c6sj5s513ck4c3n/Untitled.jpg)

ممنون بخاطر راهنماییهاتون :ناراحت:
جوابتون رو گرفتید؟؟؟؟؟؟