forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Скачка файла (http://forum.boolean.name/showthread.php?t=1195)

impersonalis 26.07.2006 21:41

Скачка файла
 
Код:

;|------------------------------------------------------|
;| ?2006 by www.Marius-Rabung.de | [email protected]|
;|------------------------------------------------------|

Function Download(Inputfile$,outputfile$, Port%=80)

 Local host$
 Local host_tmp
 Local stream
 Local file

;------------------------------- Den Host aus InputFile$ rausfiltern
 host$=right(inputfile$,len(inputfile$)-7) ; http:// rausschneiden
 host_tmp=instr(host$,"/")-1              ; Das erste Slash im String suchen und 1 abziehen
 host$=left(host$,host_tmp)                ; Den Text bis zu dem ersten Slash-1 k?rzen
 ;------------------------------ TCPStream zum Host ?ffnen
 stream = OpenTCPStream(host$,Port%)
;------------------------------- Datei Anfordern
 WriteLine stream, "GET "+Inputfile$+ " HTTP/1.1"
 WriteLine stream, "Host: "+host$
 WriteLine stream, ""
;------------------------------- Datei auf der Festplatte erstellen
 file = writeFile(outputfile$)
;------------------------------- Das Ende des HTTP Headers suchen
 For a=0 To 100
  tmp$=ReadLine(stream)
  If Instr(Lower$(tmp), "content-type")>0 Then ReadLine(stream) : Exit
 Next
;------------------------------- Datei downloaden
 While Not Eof(stream)       
  WriteByte file, ReadByte(stream)   
 Wend
;------------------------------- Alles wieder Schlie?en
 CloseFile file
 CloseTCPStream stream
End Function

взято с разрешения, от сюда:
http://www.freecoder.chat-blitz.de/

impersonalis 26.07.2006 21:43

Re: Скачка файла
 
юзание
Код:

Download("http://mariusrabung.ma.funpic.de/Temp/Download.bb", "C:/Download.bb")

impersonalis 25.09.2010 02:09

Ответ: Скачка файла
 
Чот напрягает меня заголовок цикла
Цитата:

For a=0 To 100
Кто тут в протоколах шарил - не надо ли там поставить цикл до условия If Instr(Lower$(tmp), "content-type")>0 ?

cyberblut 25.09.2010 10:31

Ответ: Скачка файла
 
Не надо. Этот цикл вообще от криворукости :) Нужно читать построчно заголовки пока не будут найдены подряд две пустые строки (\n\n) - они отделяют заголовки от тела. Ну автор вполне себе адекватно решил, что больше 100 заголовков не будет. Но только content-type может быть в любой позиции заголовков, а после него вполне себе content-length и что угодно другое. Оно в конце концов и запишется в файл, что естественно сделает его нечитаемым.
Ещё и файл может быть недоступен, тогда сервер вернёт соответствующий код результата (404, 403 и т.д), но проверки на это нету, а надо бы.

Program23 25.09.2010 11:05

Ответ: Скачка файла
 
Полезная штука,можно качать обновления игры на Blitz3d с сервера.

Phantom 25.09.2010 16:29

Ответ: Скачка файла
 
Ещё многие сервера настроены, чтобы контент чунками отдавать, это другой механизм, отличный от Content-Length, оттуда тоже эта функция скачает с ошибками и файл будет битый. Да и вообще функция кривая, да.

impersonalis 25.09.2010 19:30

Ответ: Скачка файла
 
http://blitzmax.com/codearcs/codearcs.php?code=24

impersonalis 26.09.2010 03:17

Ответ: Скачка файла
 
предыдущий код тоже устарел.
http://blitzbasic.com/codearcs/codearcs.php?code=2279
вот это прошёл почти все мои тесты. Однако срезался на некоторых - в а именно, когда сервер не присылал в ответе content-length - почему он (сервер) это делал непонятно, однако (по идее) это является корректным ответом.

Phantom 26.09.2010 16:00

Ответ: Скачка файла
 
Цитата:

Сообщение от impersonalis (Сообщение 163230)
предыдущий код тоже устарел.
http://blitzbasic.com/codearcs/codearcs.php?code=2279
вот это прошёл почти все мои тесты. Однако срезался на некоторых - в а именно, когда сервер не присылал в ответе content-length - почему он (сервер) это делал непонятно, однако (по идее) это является корректным ответом.

Я же выше написал. Сервер может отдавать контент чунками, это фича протокола HTTP/1.1. Отправляется заголовок:
PHP код:

Transfer-Encodingchunked 

Почитать об этом можно в википедии для начала, а дальше гугл ;) :
http://ru.wikipedia.org/wiki/Chunked_transfer_encoding

Я до позавчерашнего дня тоже думал, что это некорректный ответ и когда на PHP свой класс писал для HTTP давно как-то, тоже не знал как из такой ситуации выходить, и в итоге сделал всё на CURL. А вот позавчера надо было замутить простенький прокси-сервер и опять столкнулся с этой проблемой. Начал гуглить по названиям http заголовков, которые шлёт сервер, и вот на это вышел. Ты наверно тоже читаешь справку по HTTP/1.0, как и я раньше.

DeeJex 26.09.2010 16:52

Ответ: Скачка файла
 
http://forum.boolean.name/showthread.php?t=12424
Net_SaveFile
И никаких проблем/ошибок/битых файлов.

impersonalis 26.09.2010 21:15

Ответ: Скачка файла
 
Цитата:

Сообщение от Phantom (Сообщение 163251)
Я же выше написал. Сервер может отдавать контент чунками, это фича протокола HTTP/1.1. Отправляется заголовок:
PHP код:

Transfer-Encodingchunked 

Почитать об этом можно в википедии для начала, а дальше гугл ;) :
http://ru.wikipedia.org/wiki/Chunked_transfer_encoding

см. код
Код:

Case "transfer-encoding"
                                        If Lower(l2$) = "chunked" Then chunk = True

Цитата:

Сообщение от DeeJex (Сообщение 163254)
http://forum.boolean.name/showthread.php?t=12424
Net_SaveFile
И никаких проблем/ошибок/битых файлов.

Цитата:

. lib "blitz_net.dll"

Net_Init%()
Net_SaveFile%(url$,file$)
Net_GetHeader$(url$)
Net_GetUrlPart$(url$,par%,parc$)
Net_SetUrlPart$(url$,par%,parc$,val$)
Net_UrlEncode$(url$)
Net_UrlDecode$(url$)
я вообще планировал в память файл заливать,а не винт дрючить.
Но тем, у кого были другие цели - может подойти


Часовой пояс GMT +4, время: 14:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot