Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение изображения по сети и запись его в БД, Не могу переписать код, помогите 
:(
    Опции темы
rafic
Дата 18.3.2013, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.4.2012

Репутация: нет
Всего: нет



Господа, задача описана в названии.

Имеется код приема изображения по сети от клиентского приложения и сохранения его на диск в физическом виде. Мне нужно получить не физическое изображение, а только массив байт который я потом запишу в таблицу MySQL типа BLOB. В приемнике я знаю про изображение только его имя (sc.filename) и размер (sc.filesize).
Скажите как переделать этот код под поставленные задачи.
Форматы передаваемых изображений: *.BMP;*.JPG;*.GIF;*.PNG;*.TIFF"

Вот код приема данных от клиента
Код

        public void ReadCallback(IAsyncResult ar) {

            TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;

            try {
                NetworkStream inputStream = myTcpClient.tcpClient.GetStream();

                int read_byte = inputStream.EndRead(ar);

                if (read_byte > 0) {
                    // Из главного заголовка получим размер массива байтов информационного объекта
                    string header = Encoding.Default.GetString(myTcpClient.buffer);
                    int leninfo = int.Parse(header);

                    // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета
                    MemoryStream ms = new MemoryStream(leninfo);
                    byte[] temp = new byte[leninfo];
                    read_byte = inputStream.Read(temp, 0, temp.Length);
                    ms.Write(temp, 0, read_byte);
                    BinaryFormatter bf = new BinaryFormatter();
                    ms.Position = 0;
                    SendInfo sc = (SendInfo)bf.Deserialize(ms);
                    ms.Close();

                    if (sc.filesize > 0) {

                        // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации
                        FileStream fs = new FileStream(Path.Combine("uploads", sc.filename), FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize);
                        do {
                            temp = new byte[1048576];
                            read_byte = inputStream.Read(temp, 0, temp.Length);

                            // Записываем строго столько байтов сколько прочтено методом Read()
                            fs.Write(temp, 0, read_byte);

                            // Как только получены все байты файла, останавливаем цикл,
                            // иначе он заблокируется в ожидании новых сетевых данных
                            if (fs.Length == sc.filesize) {
                                fs.Close();
                                fs = null;
                                break;
                            }
                        } while (read_byte > 0);

                        temp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }

                    PrintLogs(sc.query + " " + sc.message + " "+ sc.filename);

                    myTcpClient.buffer = new byte[9];
                    inputStream.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);

                }
                else {
                    DeleteClient(myTcpClient);
                    PrintLogs("Клиент отключился");
                }
            }
            catch (Exception e) {
                DeleteClient(myTcpClient);

                // Событие клиент отключился
                PrintLogs("Error: Клиент отключился аварийно. (" + e + ")");
                SoundError();

            }

        }

PM MAIL   Вверх
rafic
Дата 18.3.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 14.4.2012

Репутация: нет
Всего: нет



Вот рабочий код! Здесь два варианта: получение массива байт картинки и сохранение ее на диск.
Код

        /// <summary>
        /// Метод асинхронно вызываемый при наличие данных в буферах приема.
        /// </summary>
        public void ReadCallback(IAsyncResult ar) {

            TcpClientData myTcpClient = (TcpClientData)ar.AsyncState;

            try {
                NetworkStream inputStream = myTcpClient.tcpClient.GetStream();

                int read_byte = inputStream.EndRead(ar);

                if (read_byte > 0) {
                    // Из главного заголовка получим размер массива байтов информационного объекта
                    string header = Encoding.Default.GetString(myTcpClient.buffer);
                    int leninfo = int.Parse(header);

                    // Получим и десериализуем объект с подробной информацией о содержании получаемого сетевого пакета
                    MemoryStream ms = new MemoryStream(leninfo);
                    byte[] temp = new byte[leninfo];
                    read_byte = inputStream.Read(temp, 0, temp.Length);
                    ms.Write(temp, 0, read_byte);
                    BinaryFormatter bf = new BinaryFormatter();
                    ms.Position = 0;
                    SendInfo sc = (SendInfo)bf.Deserialize(ms);
                    ms.Close();


                    ////
                    // Получение массива байт принятой картинки
                    ////
                    if (sc.filesize > 0) {

                        // Массив байт для сохранения принятой картинки                                 
                        // Размер массива = размеру картинки
                        byte[] imageStream = new byte[sc.filesize];

                        // Создаем место в ОП для хранения полученной картинки
                        MemoryStream ms_file = new MemoryStream();
                        do {
                            temp = new byte[buffer_size];
                            read_byte = inputStream.Read(temp, 0, temp.Length);

                            // Записываем строго столько байтов сколько прочтено методом Read()
                            ms_file.Write(temp, 0, read_byte);

                            // Как только получены все байты файла, останавливаем цикл,
                            // иначе он заблокируется в ожидании новых сетевых данных
                            if (ms_file.Length == sc.filesize) {

                                // Начинаем заполнять массив в нулевой позиции
                               int count = 0;

                                // Set the position to the beginning of the stream.
                                ms_file.Seek(0, SeekOrigin.Begin);

                                // Читаем байты и записываем их в массив
                                while (count < ms_file.Length) {
                                    int rb = ms_file.ReadByte();
                                    imageStream[count++] = Convert.ToByte(rb);
                                }

                                // А вот здесь уже запись в базу или дальнейшие действия с картинкой
                                //Bitmap bitmap2 = new Bitmap(ms_file);
                                //bitmap2.Save(@"d:\image.jpeg");

                                ms_file.Close();
                                ms_file = null;
                                break;
                            }
                        } while (read_byte > 0);

                        // Вот тот массив байт который я так жадил получить - imageStream

                        imageStream = null;
                        temp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }//*/
                    
                    ////
                    // Сохранение картинки на диск
                    ////
                    /*if (sc.filesize > 0) {

                        // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации
                        FileStream fs = new FileStream(Path.Combine("uploads", sc.filename), FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, sc.filesize);
                        do {
                            temp = new byte[1048576];
                            read_byte = inputStream.Read(temp, 0, temp.Length);

                            // Записываем строго столько байтов сколько прочтено методом Read()
                            fs.Write(temp, 0, read_byte);

                            // Как только получены все байты файла, останавливаем цикл,
                            // иначе он заблокируется в ожидании новых сетевых данных
                            if (fs.Length == sc.filesize) {
                                fs.Close();
                                fs = null;
                                break;
                            }
                        } while (read_byte > 0);

                        temp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }//*/

                    PrintLogs(sc.query + " " + sc.message + " " + sc.filename);

                    myTcpClient.buffer = new byte[9];
                    inputStream.BeginRead(myTcpClient.buffer, 0, myTcpClient.buffer.Length, new AsyncCallback(ReadCallback), myTcpClient);

                }
                else {
                    DeleteClient(myTcpClient);
                    PrintLogs("Клиент отключился");
                }
            }
            catch (Exception e) {
                DeleteClient(myTcpClient);

                // Событие клиент отключился
                PrintLogs("Error: Клиент отключился аварийно. (" + e + ")");
                SoundError();

            }

        }


Это сообщение отредактировал(а) rafic - 18.3.2013, 20:52
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.