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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение двоичных данных из базы 
:(
    Опции темы
Doss
Дата 12.6.2013, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уважаемые коллеги, помогите разобраться!
Цель: Дать возможность клиенту читать содержимое файлов, которые хроняться в БД в двоичном виде.
Так вот, не могу понять, как я должен передать эти двоичные данные? чтобы клиент их просто открыл и прочел!

Если я правильно понимаю, то вначале я считываю свои дв данные из базы методом FileStream и записываю на локальный диск, после с помощью BinaryWriter их оттуда (с диска) считываю в byte [] и должен с названием самого файла направить клиенту с помощью System.Web.HttpResponse. И наконец я удалил то, что записал на диск сервера.
Но возникли вопросы:
Вот я считал с базы, записал на диск и впихнул в byte []
Код

string query = "SELECT ДекларацияВ,ИмяФайлаДеклВ FROM ЗаказEX where id=@id";
                OleDbCommand cmd = new OleDbCommand(query, conn);
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new OleDbParameter("@id", OleDbType.Integer, 4));
                cmd.Parameters["@id"].Value = zakaz.GetId;
                FileStream stream;
                BinaryWriter writer;
                OleDbDataReader datareader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                datareader.Read();
                if (datareader["ДекларацияВ"].ToString() == "")
                {

                }
                else
                {
                    //получил длину байтов
                    int bLength = (int)datareader.GetBytes(0, 0, null, 0, int.MaxValue);
                    //считал имя и расширение файла
                    string fileNameFormat = datareader["ИмяФайлаДеклВ"].ToString();
                    //закрыл reader
                    datareader.Close();
                    //бесполезное переназначение
                    int bufferSize = bLength;
                    //ну в общем понятно
                    byte[] outByte = new byte[bLength];
                    long retval;
                    long startIndex = 0;
                    OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                    while (reader.Read())
                    {
                        //создал документ в диске сервера
                        stream = new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "\\TempData\\" + fileNameFormat, FileMode.OpenOrCreate, FileAccess.Write);
                        //воткнул в BinaryWriter файл
                        writer = new BinaryWriter(stream);
                        startIndex = 0;
                        retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        while (retval == bufferSize)
                        {
                            //вписываю в byte [] все двоичные данные
                            writer.Write(outByte);
                            writer.Flush();
                            startIndex += bufferSize;
                            retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                        }
                        writer.Write(outByte, 0, (int)retval);
                        writer.Flush();
                        writer.Close();
                        writer.Dispose();
                        stream.Close();
                        stream.Dispose();
                    }
                    reader.Close();
                    reader.Dispose();
//Здесь  можно прочесть на локальном компе, но нам ведь нужно передать клиенту!!!!!!!!!!!
                    //clientOpen (Htt
                    //Process prEx1 = new Process();
                    //prEx1.StartInfo = new ProcessStartInfo(System.AppDomain.CurrentDomain.BaseDirectory + "\\TempData\\" + fileNameFormat);
                    //prEx1.Start();
                    //prEx1.WaitForExit();
                    string path = System.AppDomain.CurrentDomain.BaseDirectory + "\\TempData\\" + fileNameFormat;
                    File.Delete(path);
                    //prEx1.Dispose();
                }


Так вот, накопал тут Чтение файла что можно прочесть и это делать так:

 
Код

 void clientOpen(System.Web.HttpResponse response, byte[] contents, string fileName)
    {
        response.Clear();
        response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.Buffer = true;
        response.Charset = ""
        response.Write(contents);
        response.End();
    }


Но один вопрос: что я должен передать в первый параметр System.Web.HttpResponse response?

Остальные два я понял.

Добавлено через 1 минуту и 20 секунд
Да, еще, клиент должен предворительно скачать файл и только после сохранения на локальном может просмотреть да?
PM MAIL   Вверх
Экскалупатор
Дата 12.6.2013, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Цитата(Doss @  12.6.2013,  11:24 Найти цитируемый пост)

Но один вопрос: что я должен передать в первый параметр System.Web.HttpResponse response?

тебе надо передать объект который является ответом на текущий запрос. можно взять из входящего Request Request.GetResponse()


Цитата(Doss @  12.6.2013,  11:24 Найти цитируемый пост)
Да, еще, клиент должен предворительно скачать файл и только после сохранения на локальном может просмотреть да? 

на примере онлайн фильмов и музыки видно что не обязательно, вопрос в том что бы софт на стороне пользователя мог работать с потоком приходящих от сервера данных, и тогда можно будет просматривать в процессе. если такого софта нету, то да, придется сначала скачать.

еще, тебе не обязательно записывать на диск байты, а потом их читать и в конце удалять файл, у тебя второй передаваемый параметр это массив этих самых байтов, пихай в него то что ты достал из базы и сразу пиши в выходной поток.
PM MAIL ICQ   Вверх
Doss
Дата 12.6.2013, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



так как мне не записывать?
Ведь я достаю из базы предварительно записав в writer = new BinaryWriter(stream);
А в конструктор BinaryWriter инициализирую через stream = new FileStream, который наследуется из IO,
Это я должен OleDbDataReader datareader = cmd.ExecuteReader(CommandBehavior.SequentialAccess) сразу запихнуть в outByte[] но как?

Временно решил сделать так
Код

HttpResponse respons=HttpContext.Current.Respons;
clientOpen(respons,outByte,fileNameFormat);

Но возникает еще одна проблема, клиенты нормально получают файлы и сохраняют их. Но открыть не могут. файлы типа не правильно кодированы и т.д.

Да, кстати в данном коде
Код

 void clientOpen(System.Web.HttpResponse response, byte[] contents, string fileName)
    {
        response.Clear();
        response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.Buffer = true;
        response.Charset = ""
        response.Write(contents);
        response.End();
    }

 все работает нормально только до команды response.End(); после выдает исключение, которое решается следующей заменой 
Код

void clientOpen(System.Web.HttpResponse response, byte[] contents, string fileName)
    {
        response.Clear();
        response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.Buffer = true;
        response.Charset = ""
        response.Write(contents);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

Ссылка на данную ошибку решение проблемы

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


Бывалый
*


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

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



Кстати, 
 response.Write(contents);
заменил на BinaryWrite
Код

response.Clear();
        response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.Buffer = true;
        response.Charset = ""
        response.BinaryWrite(contents);
        HttpContext.Current.ApplicationInstance.CompleteRequest();

Стала выдавать что файл поврежден и не может быть востановлен, в чем причина?
PM MAIL   Вверх
Doss
Дата 12.6.2013, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В общем ошибка при открытии файла в следующем:
Нужно было заменить response.Write(contents); на response.BinaryWrite(contents); что я и сделал
и обязательно добавить response.BufferOutput = true;
Все остальное может оставаться или отчасти не присутствовать№ Это точно, проверял!!! smile  smile 
Код

void clientOpen(System.Web.HttpResponse response, byte[] contents, string fileName)
    {
        response.Clear();
        response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.Buffer = true;
 response.BufferOutput = true;
        response.Charset = ""
        response.BinaryWrite(contents);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }


Ну а как впихнуть дв данные из базы сразу в метод пока не решил (работает ведь,  глаза уже на лбу!!!! Нужен сникерс и натуральная слеза).
Думаю ответит кто нибудь кто уже имеет опыт..... smile 
PM MAIL   Вверх
Экскалупатор
Дата 12.6.2013, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Цитата(Doss @  12.6.2013,  12:43 Найти цитируемый пост)

 все работает нормально только до команды response.End(); после выдает исключение, которое решается следующей заменой 


Цитата(Doss @  12.6.2013,  13:14 Найти цитируемый пост)
Стала выдавать что файл поврежден и не может быть востановлен, в чем причина? 

 наверное проблема не решилась, думаю проблема может быть в том что не весь файл пришел. Какое было исключение?

попробуй HttpResponse.WriteFile - метод 

для начала я бы вернул из приложения просто файл, нормальный, реально существующий и который нормально открывается. если все ок, то проблема скорее всего в том что ты что то теряешь при сохранении или запросе из базы(ставлю на базу). второе это надо открыть тот файл который получается после выборки из базы и сохранении на диск, но до отправки, если с ним все ок, то из базы выбирается нормально, и значит что то в самом процессе отправки. в обще надо сначала локализовать проблему.


StreamReader ReadToEnd() - читает до конца потока.

Это сообщение отредактировал(а) Экскалупатор - 12.6.2013, 15:33
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

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


 




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


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

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