Получение изображения по сети и запись его в БД

 
0
 
.NET
ava
rafic | 18.03.2013, 09:06
Господа, задача описана в названии.

Имеется код приема изображения по сети от клиентского приложения и сохранения его на диск в физическом виде. Мне нужно получить не физическое изображение, а только массив байт который я потом запишу в таблицу 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();

            }

        }
Kommentare (1)
ava
rafic | 18.03.2013, 13:35 #
Пока сидел на парах я написал вот такое

                    if (sc.filesize > 0) {
                        // Массив байт для сохранения принятой картинки
                        byte[] image = new byte[1048576];

                        // Создадим файл на основе полученной информации и массива байтов следующих за объектом информации
                        MemoryStream fs = new MemoryStream()
                        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) {

                                //Вот здесь мне нужно скопировать полученную картину в image
                                image = (моя картинка);

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

                        // А вот здесь уже запись в базу или дальнейшие действия с картинкой

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

Как это сделать?
Во-первых: в какой переменной хранится моя картинка?
Во-вторых: как скопировать массив байт в другой массив байт?
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  rafic
advanced
Absenden