-
Необходимо загрузить данные из БД в браузер. В БД данные хранятся в формате 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;
Как выполнить загрузку напрямую из БД, избегая создание временного файла, и его открытия в браузере?
-
Никак, браузер определяет тип файлов по расширению...
-
структура 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-код, могу выложить.
-
> Необходимо загрузить данные из БД в браузер. В БД данные > хранятся в формате mht.
В папке Demos, был пример Веб сервера - попробуй через него.
|