Тема: CMD/BAT: динамический вывод изображений из БД sqlite3
Без гарантий. Используете на свой страх и риск.
Можно попробовать динамичекий вывести BLOB-изображение из БД sqlite3 в окно HTA командой наподобие следующей:
sqlite3 "mysql_data.db" "select Hex(filestore.file) from filestore where filestore.id=1"|xxd -r -u -ps|mshta.exe .\viewer.hta
Функция Hex() переводит данные BLOB-файла в формат Hex-дампа, который, в свою очередь, вновь преобразуется в строковые данные файла с помощью xxd, после чего полученная строка данных направляется в StdIn HTA-скрипта просмотра. Если не использовать функцию Hex() то BLOB-данные обрежутся по первому нулевому символу. xxd же удается передать строку данных содержащую \x0 символы в StdIn HTA-скрипта просмотра.
--------
CMD-сценарий предназначен для добавления и динамического просмотра BLOB-изображений из БД sqlite3. Запуск без параметров создает БД sqlite3 "mysql_data.db", если таковая отсутствует, или предлагает выбрать индекс изображения для вывода. При перетаскивании значка изображения на файл скрипта происходит добавление файла(только одного) в БД. Не будет работать с кириллическими путями файлов.
Использована командная оболочка sqlite3.exe version 3.8.7.4.
Использован порт xxd для Win32.
Для преобразования изображения из строки в IPicture использован класс "WIA.Vector" библиотеки "Microsoft Windows Image Acquisition Library (wiaaut.dll)"(пример).
Для вывода изображения в окно HTA использован ActiveXControl "Forms.Form.1" библиотеки "Microsoft Forms 2.0 Object Library (FM20.DLL)"(пример).
См.также: CMD/BAT + HTML: два в одном
OC Win 7
sqimg.cmd
<!-- :
::
:: Динамический просмотр изображений из БД sqlite3
::
@echo off
setlocal enableextensions enabledelayedexpansion
set "dir1=%~dp0"
set "fl1=%~f1"
set dbname=mysql_data.db
chdir /d %dir1%
rem ------------------------------------------------------------------
if not exist "%dir1%%dbname%" (
echo create database %dbname%
sqlite3 "%dir1%%dbname%" "create table filestore (id INTEGER PRIMARY KEY ASC, name TEXT, crc TEXT, file BLOB)"
goto :stop
)
rem ------------------------------------------------------------------
if /i "%fl1%" equ "" (
call :getview
) else (
sqlite3 "%dir1%%dbname%" "insert into filestore(name,crc,file) values('%~nx1','0',readfile('%fl1%'))"
echo add "%fl1%"
)
:stop
echo EXIT
endlocal
pause
exit /b 0
rem ------------------------------------------------------------------
::
:: Просмотреть изображение
::
:getview
set st=
for /f "usebackq tokens=*" %%a in (`sqlite3 "%dir1%%dbname%" "select filestore.id from filestore"`) do (
set st=!st! %%a
)
sqlite3 "%dir1%%dbname%" "select filestore.id, filestore.name from filestore"
rem Выбор индекса
rem ----------------------------------------------------------
:label1
echo Choose index of image; b - break:
set /p x=""
if /i "!x!" equ "b" exit /b 0
set y=
for /f "usebackq tokens=*" %%b in (`echo !st!^|findstr /r /i "!x!"`) do (
set y=%%b
)
if /i "!y!" equ "" (
echo No such index !x!
goto :label1
)
rem ----------------------------------------------------------
rem разделитель '|' пропускается xxd
sqlite3 "%dir1%%dbname%" "select Hex(printf('%%s|',filestore.name)), Hex(filestore.file) from filestore where filestore.id=!x!"|xxd -r -u -ps|mshta "%~f0"
goto :label1
-->
<HTML>
<HEAD>
<meta http-equiv=Content-Type content="text/html; charset=windows-1251">
<TITLE></TITLE>
<HTA:APPLICATION
ID="oHTA"
APPLICATIONNAME="myApp"
</HEAD>
<BODY SCROLL="YES">
<OBJECT id="form1" CLASSID="CLSID:C62A69F0-16DC-11CE-9E98-00AA00574A4F"></OBJECT>
<SCRIPT>
/*
Просмотр изображения полученного через stdin в окне HTA
Для преобразования изображения из строки в IPicture использован класс "WIA.Vector" библиотеки "Microsoft Windows Image Acquisition Library (wiaaut.dll)"
Для вывода изображения в окно HTA использован ActiveXControl "Forms.Form.1" библиотеки "Microsoft Forms 2.0 Object Library (FM20.DLL)"
*/
adTypeBinary = 1
adTypeText = 2
adSaveCreateOverWrite = 2
var re = /(.*)\|/i;
var objForm = document.getElementById("form1");
var objVector = new ActiveXObject("WIA.Vector");
var objStream = new ActiveXObject("ADODB.Stream");
var oFs = new ActiveXObject("Scripting.FileSystemObject");
var objStdIn = oFs.GetStandardStream(0, false);
//Переписать stdin в Stream(Text)
with (objStream){
Open();
Type = adTypeText;
Charset = "windows-1251";
}
var sTxt = new String(objStdIn.Read(256));
re.exec(sTxt);
var fname = RegExp.$1;
objStream.WriteText(sTxt.replace(re,""));
while (!objStdIn.AtEndOfStream){
objStream.WriteText(objStdIn.Read(1024));
}
// Изменить тип Stream(Text) на Stream(Binary)
objStream.Position = 0;
objStream.Type = adTypeBinary;
// Загрузить изображение
objVector.BinaryData = objStream.Read();
objStream.Close();
if (typeof(objVector.ImageFile)=="unknown"){alert("Файл не является изображением.");window.close();}
// Вывести изображение на Forms.Image.1 Control
//===================================================
objForm.style.width = objVector.ImageFile.Width + 5;
objForm.style.height = objVector.ImageFile.Height + 5;
var objImg = objForm.object.Controls.Add("Forms.Image.1", "img1", true);
objImg.AutoSize = true;
objImg.Picture = objVector.Picture;
document.title = fname;
/*
// Сохранить файл
sFilePath = oHTA.commandLine;
sFileOut = sFilePath.substring(1,sFilePath.lastIndexOf('\\')+1) + "copyof_" + fname;
try{
objVector.ImageFile.SaveFile(sFileOut);
}catch(e){alert("Ошибка сохранения:"+String.fromCharCode(32)+e.description);}
*/
</SCRIPT>
</BODY>
</HTML>