ذخیره فایل zip شده در دیتابیس اکسس
پنجشنبه 29 خرداد 1393ذخیره فایل zip شده در دیتابیس اکسس در این مقاله ما قصد داریم یک فایل zip شده را در دیتابیس ذخیره کنیم
اما قبل از ذخیره فایل در دیتابیس ،ما فایل مورد نظر را برای امنیت بیشتر encrypt کرده و ذخیره می کنیم. و هنگام استفاده از آن با متد دیگری آنرا decrypt می کنیم.
ابتدا ما یک Microsoft Access database را نصب میکنید.
در دیتابیس ،یک جدول با فیلدهای زیر می سازیم.
⦁ ZipFIleID AutoNumber
⦁ ZipFileName Text
⦁ ZipFileContent OLE Object
حال یک پروژه ی جدید را در visual studio ایجاد می کنیم ودر مرحله بعد دیتابیس را به پروژه و دیتاست دیتاسورس اضافه می کنیم.
این دیتاست متدی دارد که اطلاعات یک رکورد را بازیابی میکند. پارامتر ورودی این رکورد ،ID رکورد است.شما می توانید کوئری زیر را ببینید.
SELECT ZipFIleID, ZipFileName, ZipFileContent FROM tblZipFles WHERE (ZipFIleID = ?) ORDER BY ZipFIleID DESC
مرحله بعد،ما یک فرم میسازیم و آبجکت های زیر را داخل آن قرار می دهیم.
1.دو Button(برای وارد مردن یک فایل در دیتابیس و بازیابی فایل ها از دیتابیس)
2.یک ComboBox
3. TextBox
4.ListBox
وقتی کاربر روی دکمه ای کلیک می کند،پنجره بالا باز میشود.
private void Btn_AddFileToDB_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "ZIP Files (.zip)|*.zip"; openFileDialog1.FilterIndex = 1; openFileDialog1.ShowDialog(); if (openFileDialog1.FileName.Trim() != "") { Byte[] Byt_ZipFile = null; Byt_ZipFile = UDF_ZipToByte(openFileDialog1.FileName.Trim()); Class_ByteEncryption BytEnc = new Class_ByteEncryption(Byt_ZipFile);// Encrypt Bytes . . . BytEnc.UDF_EncryptBytes(); Byt_ZipFile = BytEnc.Byt_CryptedBytes; UDF_SaveFileToDB(openFileDialog1.SafeFileName.Trim()/*Get Just FileName with Extention*/, Byt_ZipFile); } }
با کلیک برروی دکمه Add File،فایل انتخاب شده و متد زیر برای تبدیل فایل انتخاب شده به بایت صدا زده می شود.
public static byte[] UDF_ZipToByte(String filePath) { byte[] buffer; FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); try { int length = (int)fileStream.Length; // get file length buffer = new byte[length]; // create buffer int count; // actual number of bytes read int sum = 0; // total number of bytes read // read until Read method returns 0 (end of the stream has been reached) while ((count = fileStream.Read(buffer, sum, length - sum)) > 0) sum += count; // sum is a buffer offset for next reading } finally { fileStream.Close(); } return buffer; }
قبل از اینکه فایل در دیتابیس ذخیره شود ،ما باید فایل را encypt کنیم. برای این کار ما از متد UDF_EncryptBytes در کلاس Class_ByteEncryption استفاده می کنیم.
using System; using System.Data; using System.Configuration; using System.Linq; using System.Security.Cryptography; using System.Xml.Linq; public class Class_ByteEncryption { Byte[] Byt_InputBytes = null; public Class_ByteEncryption(Byte[] Byt_InpBytes) { Byt_InputBytes = Byt_InpBytes; } // ??????? public void UDF_EncryptBytes() { byte[] IV = new byte[8] { 10, 11, 85, 7, 14, 76, 10, 22 }; string cryptokey = "lar ltc"; byte[] mystring = Byt_InputBytes; byte[] my_buffer = mystring; TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); des.Key = md5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(cryptokey)); des.IV = IV; byte[] codebuffer = des.CreateEncryptor().TransformFinalBlock(my_buffer, 0, my_buffer.Length); Byt_InputBytes = codebuffer; } public Byte[] Byt_CryptedBytes { get { return Byt_InputBytes; } } }
بعد از تبدیل به بایت به وسیله متد زیر می توانیم آنرا در دیتابیس ذخیره کنیم.
private void UDF_SaveFileToDB(String Str_FileName , Byte[] Byt_ZipFile1) { DataSetTableAdapters.tblZipFlesTableAdapter db = new EncodeDecodeZipInDb.DataSetTableAdapters.tblZipFlesTableAdapter(); db.Insert(Str_FileName.Trim(), Byt_ZipFile1); UDF_GetFilesList(); MessageBox.Show("File Saved In DB . . ."); }
به وسیله متد زیر شما می توانید لیست درایو سیستم تان را در ListBox قراردهید.
private void UDF_GetHardDriveList() { String[] DriveList = System.IO.Directory.GetLogicalDrives(); foreach (string str in DriveList) { comboBox1.Items.Add(str); try { comboBox1.SelectedIndex = 0; } catch { } } }
بوسیله متد زیر می توانید دیتا های ذخیره شده در دیتابیس را نمایش دهید.
private void UDF_GetFilesList() { DataSetTableAdapters.tblZipFlesTableAdapter db = new EncodeDecodeZipInDb.DataSetTableAdapters.tblZipFlesTableAdapter(); DataSet.tblZipFlesDataTable dt = new DataSet.tblZipFlesDataTable(); db.Fill(dt); listBox1.Items.Clear(); foreach (DataRow Row in dt.Rows) { listBox1.Items.Add("Code = " + Row[0].ToString() + " - Name = " + Row[1]); } }
برای انتخاب یک فایل و ذخیره آن در درایو مورد نظرشما باید روی دکمه Export Zip کلیک کنید.
قبل از آن باید ID فایل را در تکس باکس وارد کنید و درایو مورد نظر را انتخاب کنید.
بعد از کلیک ،متد زیر اجرا می شود
private void Btn_SaveToFile_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() == "") { MessageBox.Show("Please Enter Zip File Code From List"); } else { try { DataSetTableAdapters.tblZipFlesTableAdapter db = new EncodeDecodeZipInDb.DataSetTableAdapters.tblZipFlesTableAdapter(); DataSet.tblZipFlesDataTable dt = new DataSet.tblZipFlesDataTable(); db.FillBy(dt, int.Parse(textBox1.Text.Trim())); Class_ByteDecryption DecBytes = new Class_ByteDecryption((Byte[])dt[0][2]); DecBytes.UDF_DencryptBytes(); UDF_SaveBinaryDateToFile(dt[0][1].ToString(), DecBytes.Byt_DcryptedBytes);//Saving file to db MessageBox.Show("File Saved . . . "); } catch { MessageBox.Show("Please Enter Valid Code From List. . ."); } } }
برای ذخیره فایل در دیسک متد زیر صدا زده می شود.
/// <summary> /// Save Record To Database /// </summary> /// <param name="Str_FileName"></param> /// <param name="Byt_ZipFile1"></param> private void UDF_SaveFileToDB(String Str_FileName , Byte[] Byt_ZipFile1) { DataSetTableAdapters.tblZipFlesTableAdapter db = new EncodeDecodeZipInDb.DataSetTableAdapters.tblZipFlesTableAdapter(); db.Insert(Str_FileName.Trim(), Byt_ZipFile1); UDF_GetFilesList(); MessageBox.Show("File Saved In DB . . ."); }
قبل از ذخیره فایل در دیتابیس ،فایل باید decode شود.
این کار توسط متد UDF_DencryptBytes در کلاس Class_ByteDecryption انجام می شود.
public class Class_ByteDecryption { Byte[] Byt_InputBytes = null; public Class_ByteDecryption(Byte[] Byt_InpBytes) { Byt_InputBytes = Byt_InpBytes; } public void UDF_DencryptBytes() { byte[] IV = new byte[8] { 10, 11, 85, 7, 14, 76, 10, 22 }; string cryptokey = "lar ltc"; byte[] codedstring; codedstring = Byt_InputBytes; byte[] my_buffer = codedstring; TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); des.Key = md5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(cryptokey)); des.IV = IV; byte[] codedbuffer = des.CreateDecryptor().TransformFinalBlock(my_buffer, 0, my_buffer.Length); Byt_InputBytes = codedbuffer; } public Byte[] Byt_DcryptedBytes { get { return Byt_InputBytes; } } }
اگر شما در ویندوز 64 بیت ،هنگام کامپایل با error ای مواجه شدید. تنظیمات زیر را انجام دهید.
تنظیمات App.config به صورت زیر می باشد.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="EncodeDecodeZipInDb.Properties.Settings.ZipFileDBConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=|DataDirectory|\ZipFileDB.mdb" providerName="System.Data.OleDb" /> </connectionStrings> </configuration>
نمونه هم ضمیمه شده
موفق باشید دوستان من
- C#.net
- 3k بازدید
- 5 تشکر