PDA

View Full Version : آموزش: ذخیره سازی و استخراج عکس از بانک اطلاعاتی



General-Xenon
سه شنبه 31 فروردین 1389, 23:23 عصر
با سلام خدمت دوستان برنامه نویس....:لبخند:

برای ذخیره سازی عکس در بانک اطلاعاتی، به یک جدول ( IMAGE_TB ) و یک فیلد از نوع IMAGE نیاز داریم

نام جدول :: IMAGE_TB
نام فیلد شناسه :: ID دیتا تایپ :: int تنظیمات :: Remove Primary Key + Identity
نام فیلد :: IMG دیتا تایپ :: IMAGE

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

توی صفحم یک File Upload و یک Button دارم...




protected void Button1_Click(object sender, EventArgs e)
{
//using System.Data.SqlClient;
if (System.IO.Path.GetExtension(FileUpload1.FileName) == ".jpg" && FileUpload1.HasFile == true)
{
SqlConnection CN1321 = new SqlConnection("Connection String");
SqlCommand CMD321 = new SqlCommand("INSERT INTO [IMAGE_TB]([IMG]) VALUES (@img)", CN1321);
CMD321.Parameters.Add("@img", SqlDbType.Image).Value = FileUpload1.FileBytes;
try
{
if (CN1321.State == ConnectionState.Open) CN1321.Open();
CMD321.ExecuteNonQuery();
}
catch { Response.Write("عملیات ناموفق انجام شد"); }
finally
{
Response.Write("عملیات ذخیره سازی با موفقیت انجام شد");
CN1321.Close();
}
}
else { Response.Write("فایل ارسالی اعتبار ندارد . لطفا دوباره امتحان کنید"); }


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



اما برای استخراج این عکس از بانک اطلاعاتی :: برای نشان دادن عکس در صفحات، از مسیر استفاده می کنیم..
مثال ::

<img src="./a.jpg" />پس برای نمایش عکس نیاز به فایلی داریم که کار خود عکس رو انجام بده، یعنی بشه جای مسیر عکس ازش استفاده کرد...
خوب برای این کار نیاز به فایلی داریم از نوع Generic Handler

در قسمت ضمیمه اصل سورس رو گذاشتم....:چشمک:

نهایتا شما برای دسترسی به عکس ها نیاز به همون فیلد ID دارید....یعنی وقتی عکسی رو می خواید فراخوی کنید باید یک ID بش پاس بدید، خود فایل از توی بانک، رکورد مورد نظر رو پیدا خواهد کرد و به صورت فایل خروجی عکس به شما نشان می دهد.....

دقت داشته باشید...برای استخراج عکس فقط کافیه مسیر فایل رو بش بدید....مثلا اسم فایل DB_IMG.ashx هست...

پسوند Generic Handler ها ashx هستش...

کد HTML اینجوری نوشته میشه :

<img src="./DB_IMG.ashx?cid=1" />دقت کنید...cid همون کد عکس هستش که باید خودتون به صورت Encrypt درش بیارین......


if (context.Request.QueryString["cid"] != null && context.Request.QueryString["cid"] != "")
enc1 = context.Request.QueryString["cid"].ToString();
خوب حالا تو سورس دقت کنید.....ما Data رو به صورت byte استخراج میکنم و با استفاده از Stream و Bitmap تبدیل میکنیم...
MemoryStream
Bitmap

وقتی تبدیل کردیم، حالا نوبت به فرستادن جای عکس میرسه

bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);دقت کنید به طریقه نوشتن Command

"SELECT [IMG] FROM [IMAGE_TB] WHERE [ID]='" + enc1 + "'"enc = همون ID که بش پاس دادیم.


اینم خود سورس


<%@ WebHandler Language="C#‎‎‎" Class="DB_IMG" %>

using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Data.SqlClient;
using System.IO;
using System.Configuration;
using System.Collections;

public class DB_IMG : IHttpHandler {

public void ProcessRequest(HttpContext context)
{
SqlConnection CN336546546 = new SqlConnection("Connection String");

context.Response.ContentType = "image/jpeg";
context.Response.Cache.SetCacheability(HttpCacheab ility.NoCache);
context.Response.BufferOutput = false;
string enc1 = "";
if (context.Request.QueryString["cid"] != null && context.Request.QueryString["cid"] != "")
enc1 = context.Request.QueryString["cid"].ToString();
System.IO.MemoryStream strm = new System.IO.MemoryStream();
try
{
CN336546546.Open();
SqlCommand cmd = new SqlCommand("SELECT [IMG] FROM [IMAGE_TB] WHERE [ID]='" + enc1 + "'", CN336546546);
byte[] img = (byte[])cmd.ExecuteScalar();
strm.Write(img, 0, img.Length);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(strm);
bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
finally
{
CN336546546.Close();
strm.Close();
}
}

public bool IsReusable {
get {
return true;
}
}

}
امیدوارم بدردتون بخوره .... اگر جایی مشکلی داشت پست بدید...:لبخند: