Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2010, 21:06   #1
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию MySQL.LongBlob to File (C#)

есть процедура загрузки файла в базу MySQL
Код:
public void Mysql_File_Save(string sConnString, int nCustId, byte[] bData, string sName, string sContentType, int nContentLength)
        {
            using (MySql.Data.MySqlClient.MySqlConnection oConn =
                new MySql.Data.MySqlClient.MySqlConnection(sConnString))
            {
                oConn.Open();

                MySql.Data.MySqlClient.MySqlCommand oCommand = oConn.CreateCommand();
                oCommand.Connection = oConn;


                //Add new 
                oCommand.CommandText = "insert into cust_file(customer_id, filename, filedata, contenttype, length) " +
                    "values( ?in_customer_id, ?in_filename, ?in_filedata, ?in_contenttype, ?in_length)";
                //oCommand.CommandType = CommandType.StoredProcedure;

                MySql.Data.MySqlClient.MySqlParameter oParam =
                    oCommand.Parameters.Add("?in_customer_id",
                        MySql.Data.MySqlClient.MySqlDbType.Int64);
                oParam.Value = nCustId;
                oParam = oCommand.Parameters.Add("?in_filename",
                    MySql.Data.MySqlClient.MySqlDbType.VarChar, 255);
                oParam.Value = sName;
                oParam = oCommand.Parameters.Add("?in_filedata",
                        MySql.Data.MySqlClient.MySqlDbType.LongBlob);
                oParam.Value = bData;
                oParam = oCommand.Parameters.Add("?in_contenttype",
                    MySql.Data.MySqlClient.MySqlDbType.VarChar, 255);
                oParam.Value = sContentType;
                oParam = oCommand.Parameters.Add("?in_length",
                    MySql.Data.MySqlClient.MySqlDbType.Int64);
                oParam.Value = nContentLength;

                oCommand.ExecuteNonQuery();
                oConn.Close();

            }
        }
есть процедура перевода файла в массив байтов
Код:
public byte[] FileToArray(string sFilePath)
        {
            System.IO.FileStream fs = new System.IO.FileStream(sFilePath,
                System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
            Byte[] bytes = br.ReadBytes((Int32)fs.Length);
            br.Close();
            fs.Close();
            return bytes;
        }
есть процедура определения mime типа файла
Код:
private string MimeType(string Filename)
        {
            string mime = "application/octetstream";
            string ext = System.IO.Path.GetExtension(Filename).ToLower();
            Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
            if (rk != null && rk.GetValue("Content Type") != null)
                mime = rk.GetValue("Content Type").ToString();
            return mime;
        }
структура таблицы
Код:
id  	int(11) - primary, autoinc
customer_id  	int(11)
filename  	varchar(255)
filedata  	longblob
contenttype  	varchar(255)
length  	int(11)
файл размером 24мб загружается без проблем. файл с большим размером не пробовал, т.к. мне это не надо.
как скачать файл обратно на компьютер?
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Старый 20.02.2010, 23:11   #2
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

вот сообразил кое-что
Код:
FileStream stream;
            BinaryWriter writer;
            int bufferSize = 100;
            byte[] outByte = new byte[bufferSize];
            long retval;
            long startIndex = 0;
            string pubID = "";
            ConnectToDB(ConnectionString);
            SQLdr = ExeSQL("select * from test.cust_file where cust_file.filename=\"dbforgemysqlru.exe\"");
            while (SQLdr.Read())
            {
                pubID = SQLdr.GetString(2);
                stream = new FileStream(pubID, FileMode.OpenOrCreate, FileAccess.Write);
                writer = new BinaryWriter(stream);
                startIndex = 0;
                retval = SQLdr.GetBytes(3, startIndex, outByte, 0, bufferSize);
                while (retval == bufferSize)
                {
                    writer.Write(outByte);
                    writer.Flush();
                    startIndex += bufferSize;
                    retval = SQLdr.GetBytes(3, startIndex, outByte, 0, bufferSize);
                }
                writer.Write(outByte, 0, (int)retval - 1);
                writer.Flush();
                writer.Close();
                stream.Close();
            }
            MySQL.Close();
            MessageBox.Show("файл получен");
возникает следующая проблема. либо процедура отправки файла криво отправляет файлы, либо процедура скачки их криво скачивает... отправил изображение размером 500кб, получил его обратно. но определить на изображении кривые байты невозможно. отправил exe файл размером 22,572,397мб. обратно он считался но размером 22,572,396.
вопрос, где делся ещё 1 байт? ))

к счастью есть поле с размером загруженного файла. но сейчас я не могу подключиться к базе. подключусь завтра или в понедельник. вот тогда и узнаю в какой процедуре ошибка.
Life if about choices
Make the right choice

Последний раз редактировалось TaTT DoGG; 20.02.2010 в 23:20.
TaTT DoGG вне форума Ответить с цитированием
Старый 20.02.2010, 23:23   #3
TaTT DoGG
Форумчанин
 
Аватар для TaTT DoGG
 
Регистрация: 25.04.2008
Сообщений: 476
По умолчанию

ошибка найдена, я просто ступил...
Код:
writer.Write(outByte, 0, (int)retval - 1);
заменить нужно на
Код:
writer.Write(outByte, 0, (int)retval);
темку можно считать закрытой, но не закрывать. мало ли у кого вопросы возникнут ))
Life if about choices
Make the right choice
TaTT DoGG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чём разница между unit, header file, cpp file? TwiX Общие вопросы C/C++ 6 29.04.2012 19:49
Error 1 fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory s20 Общие вопросы C/C++ 2 26.09.2009 23:28
обновление в блоге - Работа с MySQL в С++ с использованием библиотеки mysql++ Pblog Обсуждение статей 0 16.08.2009 16:00
MySQL нужна библ. для Visual C++ (MySql++) Alexoid Visual C++ 8 07.05.2008 18:29