<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: динамический вывод изображений из БД sqlite3]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17234&amp;type=atom" />
	<updated>2022-07-07T20:14:56Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=17234</id>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: динамический вывод изображений из БД sqlite3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=153816#p153816" />
			<content type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Можно попробовать динамичекий вывести BLOB-изображение из БД sqlite3 в окно HTA командой наподобие следующей:<br /></p><div class="codebox"><pre><code>
sqlite3 &quot;mysql_data.db&quot; &quot;select Hex(filestore.file) from filestore where filestore.id=1&quot;|xxd -r -u -ps|mshta.exe .\viewer.hta
</code></pre></div><p>Функция Hex() переводит данные BLOB-файла в формат Hex-дампа, который, в свою очередь, вновь преобразуется в строковые данные файла с помощью xxd, после чего полученная строка данных направляется в StdIn HTA-скрипта просмотра. Если не использовать функцию Hex() то BLOB-данные обрежутся по первому нулевому символу. xxd же удается передать строку данных содержащую \x0 символы в StdIn HTA-скрипта просмотра.</p><p>--------<br />CMD-сценарий предназначен для добавления и динамического просмотра BLOB-изображений из БД sqlite3. Запуск без параметров создает БД sqlite3 &quot;mysql_data.db&quot;, если таковая отсутствует, или предлагает выбрать индекс изображения для вывода. При перетаскивании значка изображения на файл скрипта происходит добавление файла(только одного) в БД. Не будет работать с кириллическими путями файлов.</p><p>Использована командная оболочка sqlite3.exe version 3.8.7.4.<br />Использован порт <a href="https://sourceforge.net/projects/xxd-for-windows/">xxd для Win32</a>.<br />Для преобразования изображения из строки в IPicture использован класс &quot;WIA.Vector&quot; библиотеки &quot;Microsoft Windows Image Acquisition Library (wiaaut.dll)&quot;<a href="http://forum.script-coding.com/viewtopic.php?pid=30088#p30088">(пример)</a>.<br />Для вывода изображения в окно HTA использован ActiveXControl &quot;Forms.Form.1&quot; библиотеки &quot;Microsoft Forms 2.0 Object Library (FM20.DLL)&quot;<a href="http://forum.script-coding.com/viewtopic.php?pid=12354#p12354">(пример)</a>.<br />См.также: <a href="http://forum.script-coding.com/viewtopic.php?id=8742">CMD/BAT + HTML: два в одном</a></p><p>OC Win 7</p><p><strong>sqimg.cmd</strong><br /></p><div class="codebox"><pre><code>
&lt;!-- :
::
:: Динамический просмотр изображений из БД sqlite3
::
@echo off
setlocal enableextensions enabledelayedexpansion

set &quot;dir1=%~dp0&quot;
set &quot;fl1=%~f1&quot;
set dbname=mysql_data.db

chdir /d %dir1%

rem ------------------------------------------------------------------
if not exist &quot;%dir1%%dbname%&quot; (
	echo create database %dbname%
	sqlite3 &quot;%dir1%%dbname%&quot; &quot;create table filestore (id INTEGER PRIMARY KEY ASC, name TEXT, crc TEXT, file BLOB)&quot;
	goto :stop
)
rem ------------------------------------------------------------------
if /i &quot;%fl1%&quot; equ &quot;&quot; (
	call :getview
) else (
	sqlite3 &quot;%dir1%%dbname%&quot; &quot;insert into filestore(name,crc,file) values(&#039;%~nx1&#039;,&#039;0&#039;,readfile(&#039;%fl1%&#039;))&quot;
	echo add &quot;%fl1%&quot;
)

:stop
echo EXIT
endlocal
pause
exit /b 0

rem ------------------------------------------------------------------
::
:: Просмотреть изображение
::
:getview

	set st=
	for /f &quot;usebackq tokens=*&quot; %%a in (`sqlite3 &quot;%dir1%%dbname%&quot; &quot;select filestore.id from filestore&quot;`) do (
		set st=!st! %%a
	)
	sqlite3 &quot;%dir1%%dbname%&quot; &quot;select filestore.id, filestore.name from filestore&quot;

	rem Выбор индекса
	rem ----------------------------------------------------------
	:label1

	echo Choose index of image; b - break:
	set /p x=&quot;&quot;
	if /i &quot;!x!&quot; equ &quot;b&quot; exit /b 0	

	set y=
	for /f &quot;usebackq tokens=*&quot; %%b in (`echo !st!^|findstr /r /i &quot;!x!&quot;`) do (
		set y=%%b
	)
	if /i &quot;!y!&quot; equ &quot;&quot; (
		echo No such index !x!
		goto :label1
	)
	rem ----------------------------------------------------------
	rem разделитель &#039;|&#039; пропускается xxd

	sqlite3 &quot;%dir1%%dbname%&quot; &quot;select Hex(printf(&#039;%%s|&#039;,filestore.name)), Hex(filestore.file) from filestore where filestore.id=!x!&quot;|xxd -r -u -ps|mshta &quot;%~f0&quot;
	goto :label1
--&gt;

&lt;HTML&gt;
&lt;HEAD&gt;
&lt;meta http-equiv=Content-Type content=&quot;text/html; charset=windows-1251&quot;&gt;
&lt;TITLE&gt;&lt;/TITLE&gt;
&lt;HTA:APPLICATION
        ID=&quot;oHTA&quot;
        APPLICATIONNAME=&quot;myApp&quot;
&lt;/HEAD&gt;

&lt;BODY SCROLL=&quot;YES&quot;&gt;
&lt;OBJECT id=&quot;form1&quot; CLASSID=&quot;CLSID:C62A69F0-16DC-11CE-9E98-00AA00574A4F&quot;&gt;&lt;/OBJECT&gt;
&lt;SCRIPT&gt;

	/*
	Просмотр изображения полученного через stdin в окне HTA
	Для преобразования изображения из строки в IPicture использован класс &quot;WIA.Vector&quot; библиотеки &quot;Microsoft Windows Image Acquisition Library (wiaaut.dll)&quot;
	Для вывода изображения в окно HTA использован ActiveXControl &quot;Forms.Form.1&quot; библиотеки &quot;Microsoft Forms 2.0 Object Library (FM20.DLL)&quot;
	*/

	adTypeBinary = 1
	adTypeText = 2
	adSaveCreateOverWrite = 2

	var re = /(.*)\|/i;

	var objForm = document.getElementById(&quot;form1&quot;);
	var objVector = new ActiveXObject(&quot;WIA.Vector&quot;);
	var objStream = new ActiveXObject(&quot;ADODB.Stream&quot;);
	var oFs = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);

	var objStdIn = oFs.GetStandardStream(0, false);

	//Переписать stdin в Stream(Text)
	with (objStream){
		Open();
		Type = adTypeText;
		Charset = &quot;windows-1251&quot;;
	}
	
	var sTxt = new String(objStdIn.Read(256));
	re.exec(sTxt);
	var fname = RegExp.$1;
	
	objStream.WriteText(sTxt.replace(re,&quot;&quot;));
	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)==&quot;unknown&quot;){alert(&quot;Файл не является изображением.&quot;);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(&quot;Forms.Image.1&quot;, &quot;img1&quot;, true);
	objImg.AutoSize = true;
	objImg.Picture = objVector.Picture;
	document.title = fname;	
	
	/*
	// Сохранить файл
	sFilePath = oHTA.commandLine;
	sFileOut = sFilePath.substring(1,sFilePath.lastIndexOf(&#039;\\&#039;)+1) + &quot;copyof_&quot; + fname;
	try{
	objVector.ImageFile.SaveFile(sFileOut);
	}catch(e){alert(&quot;Ошибка сохранения:&quot;+String.fromCharCode(32)+e.description);}
	*/

&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2022-07-07T20:14:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=153816#p153816</id>
		</entry>
</feed>
