1

Тема: 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>