سلام
من در پروژه مدیریت آموزشگاه، برای موجودیت Student ، هنگام ثبت نام مدارکی از قبیل عکس، تصویر کارت ملی و... را میخوام اسکن و ذخیره کنم.
سوال اولم اینه که:
بهتره تصویر مدارک نگهداری بشن یا آدرسشون؟
سپاس
Printable View
سلام
من در پروژه مدیریت آموزشگاه، برای موجودیت Student ، هنگام ثبت نام مدارکی از قبیل عکس، تصویر کارت ملی و... را میخوام اسکن و ذخیره کنم.
سوال اولم اینه که:
بهتره تصویر مدارک نگهداری بشن یا آدرسشون؟
سپاس
دست شماست.
فکر نکنم ذخیره اینها در دیتابیس باعث بالا رفتم حجمشون بشه.
اینهایی که گفتید باید اسکن شود و در قالب یه فایل باینری ذخیره کنید یعنی فیلد شما باینری مکس باید باشه.
در قالب یه اپلود میتونید read byte کنید.
اگه نظر من رو میخواهید عکس رو در داخل دیتابیس ذخیره کنید و باقی اطلاعات رو وارد کنید.داخل دیتابیس یه فیلد تعریف کنید برای عکس نوش رو بزارید varbinary(MAX) و با این دستور اول عکس رو کوچیک کنید که حجم عکس زیاد نباشه.و عکس رو ذخیره کنید بهتر هستش چون ممکنه عکس جابه جا بیش و دیگه برای مشاهده وجود نداشته باشه.این کد برای تغییر اندازه کردن عکس .// کاراهای مخصوص تغییر اندازه عکساین کد برای باز کردن عکس
#region Private Members
private Image picimage= Properties.Resources.EmployeesNoPic;
#endregion
#region Propersties
private int _imgwidth
{
get
{
return 120;
}
}
private int _imgHieght
{
get
{
return 140;
}
}
#endregion
#region Public Function
public Bitmap ResizeBitMap(Bitmap b, int nWidth, int nHeight)
{
Bitmap result = new Bitmap(nWidth, nHeight);
using (Graphics g = Graphics.FromImage((Image)result))
g.DrawImage(b, 0, 0, nWidth, nHeight);
return result;
}
#endregion
private void btnPic_Click(object sender, EventArgs e)این کد هم برای ذخیره اطلاعات
{
try
{
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "(*.JPG) تصاویر|*.jpg|" +
"(*.GIF) تصاویر|*.Gif" +
"(*.PNG) تصاویر|*.PNG" +
"" +"(*.*) تمام تصاویر|*.*";
fd.Title = "انتخاب تصویر";
fd.ShowDialog();
float imgWidth = System.Drawing.Image.FromFile(fd.FileName).Physica lDimension.Width;
float imgHeight = System.Drawing.Image.FromFile(fd.FileName).Physica lDimension.Height;
picimage = System.Drawing.Image.FromFile(fd.FileName);
if (imgWidth > _imgwidth || imgHeight > _imgwidth)
{
string strMessage = "تصویر انتخابی شما نباید بزرگتر از {1}*{0} پیکسل باشد" + "\n" +
"آیا تمایل به تغییر اندازه عکس دارید ؟";
if (PersianMessageBox.Show(string.Format(strMessage, _imgwidth, _imgHieght), "پیام سیستم", PersianMessageBox.Buttons.YesNo, PersianMessageBox.Icon.Warning) == DialogResult.Yes)
{
picimage = ResizeBitMap((Bitmap)picimage, _imgwidth, _imgHieght);
Pictcurebox1.Image = picimage;
}
else
{
picimage = Properties.Resources.EmployeesNoPic;
Pictcurebox1.Image = picimage;
}
}
else
{
Pictcurebox1.Image = picimage;
}
}
catch { }
}
private void BtnAdd_Click(object sender, EventArgs e)
{
if (TxtAddNumber.Text.Trim() == "")
{
errorProvider1.SetError(TxtAddNumber, "لطفاً شماره ثبت شرکت را وارد فرمائید");
TxtAddNumber.Focus();
return;
}
if (cmbNoyeMosse.Text.Trim() == "")
{
errorProvider1.SetError(cmbNoyeMosse, "لطفاَ نوع موسسه را وارد فرمایید");
cmbNoyeMosse.Focus();
return;
}
if (TxtNameCompaney.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameCompaney, "لطفاً نام شرکت را وارد فرمائید");
TxtNameCompaney.Focus();
return;
}
if (TxtNameDefter.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameDefter, "لطفاً نام دفتر را وارد فرمائید");
TxtNameDefter.Focus();
return;
}
if(CmbSex.Text.Trim()=="")
{
errorProvider1.SetError(CmbSex, "لطفاً جنسیت را تعریف فرمائید");
CmbSex.Focus();
return;
}
if (TxtNameAdmin.Text.Trim() == "")
{
errorProvider1.SetError(TxtNameAdmin, "لطفاً نام مدیر را وارد فرمائید");
TxtNameAdmin.Focus();
return;
}
if (TxtTel.Text.Trim() == "")
{
errorProvider1.SetError(TxtTel, "لطفاً شماره تماس را وارد فرمائید");
TxtTel.Focus();
return;
}
if (TxtCreateDate.Text.Trim() == "")
{
errorProvider1.SetError(TxtCreateDate, "لطفاً تاریخ احداث ایجاد شرکت را وارد فرمائید");
TxtCreateDate.Focus();
return;
}
if (TxtAddress.Text.Trim() == "")
{
errorProvider1.SetError(TxtAddress, "لطفاً آدرس شرکت را وارد فرمائید");
TxtAddress.Focus();
return;
}
if (TxtDistrbuite.Text.Trim() == "")
{
errorProvider1.SetError(TxtDistrbuite, "لطفاً شرح و وظایف شرکت را وارد فرمائید");
TxtDistrbuite.Focus();
return;
}
//if (Pictcurebox1.Image == null)
//{
// PersianMessageBox.Show("شما هیچ تصویری را برای این گذاینه انتخاب نکردید", "خطا در یافت تصویر", PersianMessageBox.Buttons.OK, PersianMessageBox.Icon.Error);
//}
else
{
try
{
MemoryStream ms = new MemoryStream();
try
{
Pictcurebox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
}
catch { }
byte[] arrPic = ms.GetBuffer();
ms.Close();
//SqlConnection con = new SqlConnection();
//con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\DbPoshakSayeBan.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
db.Connect();
db.cmd = new SqlCommand();
db.cmd.Connection = db.con;
db.cmd.CommandText = "insert into TBL_Compane (C_AddNumber,C_NameDefterMaly,C_NoyeMosse,C_NameMo sse,C_Sex,C_Admin,C_Distrbuite,C_Tel,C_Fax,C_DateC reate,C_Addreass,C_Logo) Values " +
"(@C_AddNumber,@C_NameDefterMaly,@C_NoyeMosse,@C_N ameMosse,@C_Sex,@C_Admin,@C_Distrbuite,@C_Tel,@C_F ax,@C_DateCreate,@C_Addreass,@C_Logo)";
//cmd.Parameters.AddWithValue("@C_ID", Int32.Parse(txtid.Text));
db.cmd.Parameters.AddWithValue("@C_AddNumber",TxtA ddNumber.Text);
db.cmd.Parameters.AddWithValue("@C_NameDefterMaly" , TxtNameDefter.Text);
db.cmd.Parameters.AddWithValue("@C_NoyeMosse", cmbNoyeMosse.SelectedItem.ToString());
db.cmd.Parameters.AddWithValue("@C_NameMosse", TxtNameCompaney.Text);
db.cmd.Parameters.AddWithValue("@C_Sex", CmbSex.SelectedItem.ToString());
db.cmd.Parameters.AddWithValue("@C_Admin", TxtNameAdmin.Text);
db.cmd.Parameters.AddWithValue("@C_Distrbuite", TxtDistrbuite.Text);
db.cmd.Parameters.AddWithValue("@C_Tel", TxtTel.Text);
db.cmd.Parameters.AddWithValue("@C_Fax", TxtFax.Text);
db.cmd.Parameters.AddWithValue("@C_DateCreate", TxtCreateDate.Text);
db.cmd.Parameters.AddWithValue("@C_Addreass", TxtAddress.Text);
db.cmd.Parameters.AddWithValue("@C_Logo", SqlDbType.Image).Value = arrPic;
db.cmd.ExecuteNonQuery();
db.Disconnect();
FrmCompane_Load(null, null);
}
catch(Exception ex)
{
if (!ShowFrienMessge)
PersianMessageBox.Show(ex.Message);
else
PersianMessageBox.Show("اشکال در ذخیره اطلاعات / خطا 103", "خطا", PersianMessageBox.Buttons.OK, PersianMessageBox.Icon.Error);
//if (db.LastError != "")
// PersianMessageBox.Show("خطا 103" + db.LastError);
}
}
به وسیله این می ونید اطلاعات خود را ذخیره کنید و تصویر هم با حجم کم ذخیره مکنید که سیستم سنگین نشه اگگه حجک عکس بیشتر بود کم میشه. و به صورت باینری ذخیره میشه.
دقت داشته باشین که حجم دیتابیس تا گیگ ها قابل افزایش پس نگرانی نیست.
بله دیتابیس میتونه اطلاعات رو حجم بسیاز یاد در خود ذخیره کنه ولی وقتی حجم دادها زاد شود اون موقع در بالا امد سیستم ، سیستم سنگین میشود و دیر بالا میاد مثل این میمونه وقتی 70000 رکود داریم و میخوایم فراخوانی کنیم نزدیک 1 یا 2 دقیقه میکشه حالا به این توجه داشته باشیم عکس رو حجم زیاد ذخیره کنیم و میخواد بالا بیاد 70000 تا رکورد به جای 1 یا 2 دقیقه 20 یا 30 دقیقه بکشه این هم هستش.برادر
نه ادرسو ذخیره کن و نه خود عکسو
با ی الگوریتم خاصی تصاویر رو تغییر نام بده و تو پوشه مورد نظرت ذخیره کن
مثلا student با id = 10 تصاویری داره با نام هایی که با 10 آغاز میشه و بقیشو دیگه مهم نیس که چی میذاری
و موقعی که میخوای بازیابی کنی تصاویرو از همین الگوریتم استفاده میکنی و تصاویر مربوط به این دانش آموز رو برمیگردونی
موفق
منم منظورم همین بود عکس رادر پوشه قرار بده و شناسه برای عکس در نظر بگیرد
(که میتون آدی باشه یا آدرس و یاو.....)
در نسخه 2012 قابلیت File Table به SQL Server اضافه شده که به همین منظور (ذخیره داده ها حجیم) جهت جدا کردن اون از داده های کم حجم تر استفاده میشه.
قبل از اینکه بتونید استفاده کنید باید قابلیت FILESTREAM رو فعال کنید:http://msdn.microsoft.com/en-us/library/cc645923.aspx
و بعد یکی از روی لینک قدم به قدم بسازید:http://msdn.microsoft.com/en-us/library/gg509088.aspx
و بعد تصاویرتون رو لود کنید: http://msdn.microsoft.com/en-us/library/gg492083.aspx
-- Add a path locator column to the PhotoMetadata table.
ALTER TABLE PhotoMetadata ADD pathlocator hierarchyid;
-- Get the root path of the Photo directory on the File Server.
DECLARE @UNCPathRoot varchar(100) = '\\RemoteShare\Photographs';
-- Get the root path of the FileTable.
DECLARE @FileTableRoot varchar(1000);
SELECT @FileTableRoot = FileTableRootPath('dbo.PhotoTable');
-- Update the PhotoMetadata table.
-- Replace the File Server UNC path with the FileTable path.
UPDATE PhotoMetadata
SET UNCPath = REPLACE(UNCPath, @UNCPathRoot, @FileTableRoot);
-- Update the pathlocator column to contain the pathlocator IDs from the FileTable.
UPDATE PhotoMetadata
SET pathlocator = GetPathLocator(UNCPath);
اگه میشه در مورد ذخیره عکس در فایل و ذخیره آدرس عکس تو دیتابیس اطلاعاتی بدین
با تشکر از راهنمایی همه دوستان
آقای fakhravari، منم با نظر davidrobert موافقم. احساس می کنم ذخیره عکس ها در دیتابیس، هر چند حجم عکس ها را پایین بیاریم ممکنه باعث کند شدن سیستم بشه
ولی از طرفی هم نگران امنیت داده هام هستم و اینکه هرکسی که وارد سیستم بشه می تونه به عکس ها و سایر مدارک داوطلبا دسترسی داشته باشه. (البته نمی دونم این کار مشکلات احتمالی دیگه ای هم داره یا نه)
آقای tooraj_azizi_1035
بنده با نسخه 2008R2 دیتابیسم را ایجاد کردم
انشاءالله بعد از تغییر ورژن حتما در پروژه هام از این قابلیتی که فرمودید استفاده می کنم
ما که کسی نیستیم بین این اساتید که نقل قول کردن ولی به نظر من اگه عکس را ذخیره کنی بهتر باشه
وقت بگم اگه بخواهی دیتابیس رو از 2008 به 2012 ارتقاع بدی دیگه قابل برگشت به 2008 نیست و دیگه با سکول سرور 2008 می توانه ای برگردی جز اینکه قبل از آبدیت کردن دیتابیست از 2008 به 2012 یه کپی ازش بگیری منم میخوام با دات نت 2012 و اسکلو سرور 2012 کار کنم ولی مشکلی دارم چون همه فایل ها کمکی که دارم با اسکول سرور 2008 باز میشه و دات نت 2010 بدون هیچ مشکلی ولی اگه با دانت و اسکل سرور 2012 باز کنم دیگه اجراری برای پروژم ندارم تا ببنیم کدام پروژه کار میکنه و هر کدامش چی کاری رو انجام میده من همچین مشکلی رو با 2012 بر خورد کردم ولی قبلش از فایل هم کپی گرفته بودم 2 تا داشتماز فایل ها تا تونستم به اطلاعات دسرسی داشته باشم و ببینم.