У меня есть исполняемый скрипт winCGI, возвращающий изображение. Я использую Intraweb в качестве сервера.
У меня есть пользовательский веб-сервер, созданный в Delphi, и я создаю функцию для запуска CGI и возврата изображения.
CGI от стороннего производителя иЯ не могу изменить твой код. У меня следующий код, возвращаемый из CGI при запросе изображения:
'Content-type: image/gif'#$A'Access-Control-Allow-Origin: *'#$A#$A'GIF89a@'#1'@'#1#0#0#0'!ÿ'#$B'NETSCAPE2.0'#3#1'ÿÿ'#0'!ù'#4#0'!'#0#0#0','#0#0#0#0'@'#1'@'#1'‡'#0#0#0#1#1#1#2#2#2#3#3#3#4#4#4#5#5#5#6#6#6#7#7#7#8#8#8#9#9#9#$A#$A#$A#$B#$B#$B#$C#$C#$C#$D#$D#$D#$E#$E#$E#$F#$F#$F#$10#$10#$10#$11#$11#$11#$12#$12#$12#$13#$13#$13#$14#$14#$14#$15#$15#$15#$16#$16#$16#$17#$17#$17#$18#$18#$18#$19#........
Мне нужно отправить изображение в приложение внешнего интерфейса в браузере.
<div>
<img src="getImage(1)">
</div>
Здесь getImageФункция берет изображение с сервера, но не показывает, потому что я думаю, что формат, который я возвращаю изображение с сервера во внешний интерфейс, имеет что-то неправильно. Как можно исправить текст содержимого изображения на сервере, чтобы оно было допустимым изображением в интерфейсе?
function RunCGIOutput(CommandLine: string; Stream:TStream;Folder: string = ''): string;
const
CReadBuffer = 2400;
var
saSecurity: TSecurityAttributes;
hRead: THandle;
hWrite: THandle;
suiStartup: TStartupInfo;
piProcess: TProcessInformation;
dRead: DWORD;
Handle,WasOK:Boolean;
Buffer: array[0..CReadBuffer] of AnsiChar;
BytesRead: Cardinal;
WorkingDirP,EnvBlock:PChar;
begin
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := true;
saSecurity.lpSecurityDescriptor := nil;
EnvBlock := BuildEnvBlock(True);
if Folder <> '' then WorkingDirP := PChar(Folder)
else WorkingDirP := nil;
if CreatePipe(hRead, hWrite, @saSecurity, 0) then
try
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.hStdInput := hRead;
suiStartup.hStdOutput := hWrite;
suiStartup.hStdError := hWrite;
suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
Handle:=CreateProcess(nil, PChar(CommandLine), @saSecurity, @saSecurity, true, CREATE_UNICODE_ENVIRONMENT, EnvBlock, WorkingDirP, suiStartup,
piProcess);
CloseHandle(hWrite);
if Handle then
try
repeat
WasOK := ReadFile(hRead, Buffer, CReadBuffer, BytesRead, nil) and (BytesRead>0);
if WasOK then
Stream.WriteBuffer(Buffer, BytesRead);
until not WasOK;
WaitForSingleObject(piProcess.hProcess, INFINITE);
finally
CloseHandle(piProcess.hThread);
CloseHandle(piProcess.hProcess);
end;
finally
CloseHandle(hRead);
StrDispose(EnvBlock);
end;
end;
//Run CGI, take image and send to browser
function TContentImaqge.Execute(aRequest: THttpRequest; aReply: THttpReply;
const aPathname: string; aSession: TIWApplication;
aParams: TStrings): boolean;
var
s,wresult,saida,LocalDoc:string;
i:integer;
Stream:TMemoryStream;
begin
Result:=True;
LocalDoc:=TIWAppInfo.GetAppPath + 'wwwroot\cgi-bin\newweb\dgate.exe';
Stream:=TMemoryStream.Create;
saida:=RunCGIOutput(LocalDoc,Stream,TIWAppInfo.GetAppPath + 'wwwroot\cgi-bin\newweb\');
Stream.Position:=0;
saida:=ReadStringFromStream(Stream, -1, IndyTextEncoding_OSDefault);
with aReply do
begin
ResetReplyType;
Code := 200;
ContentType := MIME_GIF; // MIME_HTML;
SendStream(Stream);
end;
end;