ذخیره فایل zip شده در دیتابیس اکسس

پنجشنبه 29 خرداد 1393

ذخیره فایل zip شده در دیتابیس اکسس در این مقاله ما قصد داریم یک فایل 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>

 

نمونه هم ضمیمه شده

موفق باشید دوستان من

فایل های ضمیمه

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید