Войти

Показать полную графическую версию : [решено] Отделить заголовок от html


Страниц : [1] 2

morgan1991
13-04-2010, 17:15
Здравствуйте!
Отправляю серверу по 80 порту заголовок, получаю заголовок и файл png.
Необходимо отделить заголовок в отдельную переменную и правильно сохранить файл 1.png.

То что возвращает сервер во вложениях.
Помогите плиз.....

morgan1991
13-04-2010, 21:28
пробовал браузером приконнектиться к скрипту чтобы он вернул ему картинку, дак браузер выдаёт:
0x485454502F312E3120323030204F4B0D0A5365и т.д.
никак не пойму как всётаки просмотреть эту картинку в программе, а не через браузер.
InetGet не подходит... Там есть свой косяк...
Хотябы намекните ктонибудь, что это за данные вообще передаются от сервера???
почемуто если прямо через браузер зайти по ссылке, то картинка отображается нормально, а если скриптом получить весь код и передать браузеру он выводит - писал выше что выводит...
Помогите пожалуйста, очень, очень нужно...

kaster
13-04-2010, 22:37
morgan1991, там бинарный код картинки. запиши эти данные (0x485454502F312E3120323030204F4B0D0A5365и т.д.) в файл в бинарном режиме. к примеру, запиши эти данные в какую нибудь переменную, предположим $s, а потом уже пиши его в предварительно открытый в бинарном режиме файл
$hWrite = FileOpen(@ScriptDir & '\test.png', 16 + 2)
FileWrite($hWrite, $s)
FileClose($hWrite)
по идее, получившийся файл должен быть искомым

morgan1991
13-04-2010, 22:46
kaster, дак в том то и косяк...
данные передаются бинарные, но в них и заголовок, т.е. нужно получить данные
TCPRecv($ConnectedSocet, 2048, 0)
С этим флагом они автоматом переведутся из бинарного вида в строку, затем отделить заголовок сервера от данных файла, затем перевести данные файла обратно в бинарный вид и записать в файл в бинарном режиме. Но это теория, а на практике я не могу отделить заголовок, а если вручную в созданном файле удалить заголовок, то файл становится не читаемым для просмотрщиков изображений.

kaster
13-04-2010, 22:54
По всей видимости, какие-то косяки при конвертации из бинарного в текстовый и обратно. я тоже не смог переделать код в картинку. попробуй принимать данные сразу в бинарном виде, сохранить поток в файл, открыть любым умным редактором и удалить все, что до ‰PNG

morgan1991
13-04-2010, 23:21
открыть любым умным редактором и удалить все, что до ‰PNG »
Открыл через Notepade++ и всё получилось, картинка стала рабочей, но как это сделать на Autoit ???

А если через Scite удаляю всё до ‰PNG, тогда картинка не открывается

kaster
13-04-2010, 23:30
но как это сделать на Autoit ? »
точно так же :)
после сохранения, по идее при открытии и закрытии подобных подстав уже не должно быть

$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 0)
$hWrite = FileOpen($sFile_new, 2)
Do
$line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
$line &= FileRead($hRead)
FileClose($hRead)
FileWrite($hWrite, $line)
FileClose($hWrite)

morgan1991
13-04-2010, 23:57
kaster, вообщем подправил немного ошибки и коечто изменил.

$sFile = @ScriptDir & '\test1.png'
$sFile_new = @ScriptDir & '\test2.png'
$hRead = FileOpen($sFile, 0)
$hWrite = FileOpen($sFile_new, 2)
Do
$line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
Do
$line &= @CRLF & FileReadLine($hRead)
Until @error = -1
$line &= @CRLF & FileRead($hRead)
FileClose($hRead)
FileWrite($hWrite, $line)
FileClose($hWrite)
$line &= FileRead($hRead) - не подходит, т.к. он не читает до конца а только следующие две строчки, т.к. дальще в файле такая строка:
NULNULNUL
поэтому заменил на:
Do
$line &= @CRLF & FileReadLine($hRead)
Until @error = -1
И всеравно не помогло, скрипт игнорит:
NUL, как будто их нет, я даже в не могу вручную скопировать эту строку и вставить на форум, винда её просто игнорит...

kaster
14-04-2010, 00:08
А если так
$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 16)
$hWrite = FileOpen($sFile_new, 16 + 2)
Do
$line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
$line &= FileRead($hRead)
FileClose($hRead)
FileWrite($hWrite, $line)
FileClose($hWrite)

morgan1991
14-04-2010, 00:27
Тоже не катит, он ‰PNG вставляет как есть а остальное в бинарном виде и получается:
‰PNG0x41E9A0A2485144309A8888800521108DA222112536343131и т.д.

kaster
14-04-2010, 00:54
$sFile = @Script & '\test.png'
$sFile_new = @Script & '\test2.png'
$hRead = FileOpen($sFile, 16)
$hWrite = FileOpen($sFile_new, 16 + 2)
Do
$line = FileReadLine($hRead)
Until StringInStr($line, '‰PNG')
FileWrite($hWrite, $line)
FileClose($hWrite)
$Content = FileRead($hRead)
FileClose($hRead)
$hWrite = FileOpen($sFile_new, 16 + 1)
FileWrite($hWrite, $Content)
FileClose($hWrite)

madmasles
14-04-2010, 00:54
У меня, вроде, так получилось:$sFile = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test.png'
$sFile_new = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test2.png'
$hRead = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile)
$hWrite = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile_new, 2)
Do (http://www.autoitscript.com/autoit3/docs/keywords.htm#Do)
$line = FileReadLine (http://www.autoitscript.com/autoit3/docs/functions/FileReadLine.htm)($hRead)
Until (http://www.autoitscript.com/autoit3/docs/keywords.htm#Until) StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($line) = 0
$Buf = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($hRead)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hWrite, $Buf)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hRead)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hWrite)

morgan1991
14-04-2010, 01:26
kaster, madmasles, не так не так не работает...

madmasles
14-04-2010, 01:47
morgan1991,
Я переименовал Ваш файл 1.txt в test.png и своим скриптом его обработал. Держите оба файла:

morgan1991
14-04-2010, 12:05
madmasles, всё верно, но косяк в том что заголовок может быть и таким:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 06:30:22 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=d60c21e5cc25be80aa294dad7955eb0b; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache
Content-Length: 4601

‰PNG
А может и таким:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 06:30:22 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=d60c21e5cc25be80aa294dad7955eb0b; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache

12dc5
‰PNG
Тогда ваш скрипт не работает:
12dc5 - меняется... Причём я незнаю при каких обстоятельствах...

madmasles
14-04-2010, 13:12
morgan1991,
Не знаю, случайно это или нет, но в Ваших обоих примерах строка с ‰PNG под № 13. Если так всегда, то так попробуйте:$sFile = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test.png'
$sFile_new = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test2.png'
$hRead = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile)
$hWrite = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile_new, 2)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 12
$line = FileReadLine (http://www.autoitscript.com/autoit3/docs/functions/FileReadLine.htm)($hRead)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$Buf = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($hRead)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hWrite, $Buf)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hRead)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hWrite)У меня так с обоими заголовками работает.

PS
А так не важно, с какой строки начинается ‰PNG:#include <file.au3>

Dim (http://www.autoitscript.com/autoit3/docs/keywords.htm#Dim) $aFile
$sFile = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test.png'
$sFile_new = @ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & '\test2.png'
_FileReadToArray($sFile, $aFile)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $ii = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFile[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($aFile[$ii], "‰PNG") <> 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$hRead = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile)
$hWrite = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile_new, 2)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $ii - 1
$line = FileReadLine (http://www.autoitscript.com/autoit3/docs/functions/FileReadLine.htm)($hRead)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$Buf = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($hRead)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hWrite, $Buf)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hRead)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hWrite)

morgan1991
14-04-2010, 13:29
Неа не работает...
$Buf = FileRead($hRead) - считывает только строчку ‰PNG и следующую а остальное игнорирует...
А если забить в цикл $Buf = FileReadLine($hRead) - то он игнорить часть данных, например NUL и в добавок к этому:
но в Ваших обоих примерах строка с ‰PNG под № 13 »
Иногда №14 а иногда №13...
А на какой вы версии AutoIt роверяли? У меня стоит: 3.3.0.0

madmasles
14-04-2010, 13:37
morgan1991,
У меня AutoIt 3.3.6.0 и все отрабатывает. Я проверил.

morgan1991
14-04-2010, 13:45
madmasles, поставил 3.3.6.0 и всё действительно заработало, но заголовок по прежнему возвращается иногда такой:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 08:11:06 GMT
Content-Type: image/png
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=a011606fac4847769797371c247a50e4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache
Content-Length: 4707

‰PNG
А иногда такой:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 14 Apr 2010 08:12:37 GMT
Content-Type: image/png
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.2.6-1+lenny6
Set-Cookie: PHPSESSID=07618803a61b299120d3709617ee59c1; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-control: no-cache

1255
‰PNG

Может можно какимто регулярным выражением удалить всё до ‰PNG ???

madmasles
14-04-2010, 14:04
morgan1991,
Попробуйте моим последним кодом обработать test.png. У меня так обрабатывает нормально независимо от заголовка.




© OSzone.net 2001-2012