Конференция "Corba" » Как загрузить mht из БД в Браузер [Delphi, Windows]
 
  • Firebird (01.12.07 14:47) [0]
    Необходимо загрузить данные из БД в браузер. В БД данные хранятся в формате mht.

     Если загружать данные из БД и сохранить их в файле c:/temp.mht, а затем открыть этот файл в браузере, то работает:

       procedure GetData;
       var sl: TStringList;
       begin
          sl:= TStringList.Create;
          sl.Assign(Table.FieldByName('data'));
          sl.SaveToFile('c:/temp.mht');
          WebBrowser.Navigate('c:/temp.mht');
          sl.Free;
       end;  

     Хотел загрузить данные напрямую в браузер, но не получается, данные выводятся в текстовом виде. Использовал код:

     uses ActiveX;
     procedure GetData;
     var sl: TStringList;
          ms: TMemoryStream;
     begin
       sl:= TStringList.Create;
       sl.Assign(Table.FieldByName('data'));

       ms:= TMemoryStream.Create;
       sl.SaveToStream(ms);
       ms.Seek(0, 0);

       WebBrowser.Navigate('about:blank');
       (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));    
       sl.Free;
       ms.Free;
     end;

     Как выполнить загрузку напрямую из БД, избегая создание временного файла, и его открытия в браузере?
  • Плохиш © (01.12.07 23:25) [1]
    Никак, браузер определяет тип файлов по расширению...
  • структура mht-файла примерно такова

    HTML
    =20=20
    CSS
    =20=20
    Картинки.

    По подстроке "=20=20" файл разбивается на 3 вышеописанных части, в каждой будет некоторая шапочка примерно из 8 строк, ее нужно вырезать. HTML и CSS хранятся в закодированном виде. Раскодировать очень просто. Считываем файл посимвольно от начала до конца. Ключом раскодирования является символ "=". За ним берутся 2 следующих символа. Если их ASCII коды равны 13 и 10, то эта комбинация не значит ничего и приравнивается к пустой строке в результате декодирования. Если нет, то это ASCII-код в шестнадцатеричной форме. Берем эти два символа, преобразуем в десятичный и с помощью chr() получаем декодированный символ. Следующим символом, прочитанным из файла после декодирования, будет не тот, который идет за "=", а тот, который стоит правее на 2 знака. Например, в позиции 10 такая комбинация: "=7D". В результате декодирования получится "{", а следующий символ для декодирования будет читаться с позиции 13. Если декодируемый символ - не знак "=", то декодировать не нужно.
    Далее формируем содержимое файла. Сперва идет CSS. Обставляем декодированную CSS тэгами
    <style type="text\css">сначала, и
    </style> с конца,
    далее вставляем декодированный HTML. Это уже работает у меня.
    Картинки как выдирать пока не допетрил еще, делается это побайтным копированием, и выводом в поток, с указанием <content-type='image\gif'>. Естественно, в этом случае ссылкой на картинку становится не ссылка на существующий файл, а ссылка на CGI-приложение, выдирающее картинку из mht, и выдающее её. Это решение ближе к веб, чем к Delphi.
  • С картинками сложнее. В третьей части mht-файла картинки хранятся в кодировке base64, достаточно считать первую строку в секции картинки до комбинации символов chr(13)+chr(10)+"--" (или chr(10)+chr(13)+"--"),убрать все символы, равные chr(10) и chr(13). Далее применить декодирование из base64 и сохранить в файл (не текстовый). Имя файла так же указывается в секции картинки. Но вот только у меня почему-то из 3 картинок нормально обработалось только 2. Благо, на все mht-файлы картинки одни и те же. В итоге я просто взял эти готовые картинки, ссылкина картинки в html-коде  с "cid" (временное хранилище) поменял на ссылки на постоянное место на сервере, и все работает отлично.
    Как добраться до картинок (а так же HTML и CSS) - закрываем все окна Internet Explorer, в папке временных файлов интернета C:\Documents and Settings\user_name\Local Settings\Temporary Internet Files\Content.IE5 удаляем все папки, и потом запускаем mht-файл. Далее все не пустые файлы открываем в блокноте. Любой программист сразу увидит, в котором лежит CSS, в котором HTML, в графических файлах мало вразумительного, но по первым буквам понятен тип файла. Далее переименовываем графические файлы с расширениями, анализируем HTML-код, ищем нужные имена графических файлов, меняем пути к ним.
    Если нужен PHP-код, могу выложить.
  • tesseract © (23.10.08 10:58) [4]

    > Необходимо загрузить данные из БД в браузер. В БД данные
    > хранятся в формате mht.


    В папке Demos, был пример Веб сервера - попробуй через него.
 
Конференция "Corba" » Как загрузить mht из БД в Браузер [Delphi, Windows]
Есть новые Нет новых   [120360   +38][b:0][p:0]