![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисунок из Интернета в TImage [D6, D7, WinXP]
KonstantinXaker(KX) © (2005-05-15 00:23:00)Люди! Каким образом мне из Интернета загрузить рисунок прямо в TImage????????????
KonstantinXaker(KX) (2005-05-30 16:45:00) [1]Alex Konshin ©
Этот пример рабочий. Если что-то непонятно - пиши на мыло
NMHTTP1.InputFileMOde := true ;
NMHTTP1.Body := edit5.Text ; //Сохранить в... (edit5.Text-путь, куда нужно сохранить файл)
NMHTTP1.Get(edit3.Text); //Ссылка на любой файл
Alex Konshin (2005-05-29 05:48:00) [2]Очевидно, нужно соединиться.
По по поводу примера: я заблуждаюсь, когда думаю, что в ответ на строку в заголовке HTTP "Accept-Encoding: gzip, deflate" я могу получить запакованный gzipом файл? Если нет, то почему это в примере не учитывется или почему этот заголовок не убран?
KonstantinXaker(KX) (2005-05-29 02:23:00) [3]Люди! Каким методом проскочить выше описанную ошибку?
KonstantinXaker(KX) (2005-05-27 17:17:00) [4]Сс проксяком у меня проблемы уже нет - я использую для загрузки рисунков компонент TNMHTTP
Теперь:
Каким образом мне проскочить ошибку Soccet is not connect
panov (2005-05-27 17:08:00) [5]Как мне прописать Proxy и Proxy-port?
А этот вопрос обсуди в новой ветке.
KonstantinXaker(KX) (2005-05-27 16:40:00) [6]Как мне прописать Proxy и Proxy-port?
KonstantinXaker(KX) (2005-05-25 19:53:00) [7]Здорово!
Теперь у меня следующий код: (загружаю рисунок http://65.200.140.25/ec_metros/ourcams/big_ben.jpg)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ScktComp;
type
TForm1 = class(TForm)
CS: TClientSocket;
Button2: TButton;
Image1: TImage;
procedure Button2Click(Sender: TObject);
procedure CSConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
procedure CSDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
st:TMemoryStream;
Header:boolean;
Len:integer;
implementation
uses Jpeg;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
CS.Host:='65.200.140.25';
CS.Port:=8080;
CS.Open;
end;
procedure TForm1.CSConnect(Sender: TObject; Socket: TCustomWinSocket);
var
str:string;
begin
st:=TMemoryStream.Create;
str:='GET /ec_metros/ourcams/big_ben.jpg HTTP/1.1'+#13#10+
'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10+
'Referer: http://www.mota.ru/download.php?path=nature&img=537.jpg'+#13#10+
'Accept-Language: ru'+#13#10+
'Accept-Encoding: gzip, deflate'+#13#10+
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+#13#10+
'Host: www.mota.ru'+#13#10+
'Connection: Keep-Alive'+#13#10+#13#10;
Header:=true;
Socket.SendText(str);
end;
procedure TForm1.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf:Array [0..1023] of char;
rb:integer;
str:string;
i:integer;
begin
rb:=Socket.ReceiveBuf(buf,SizeOf(buf));
if Header then
begin
for i:=0 to rb do
begin
str:=str+buf[i];
if pos(#13#10#13#10,str)>0 then
begin
Header:=false;
Str:=copy(str,pos('Content-Length:',str)+length('Content-Length:')+1,length(str));
str:=copy(str,1,pos(#13#10,str)-1);
Len:=StrToInt(str);
move(buf[i+1],buf[0],SizeOf(buf));
dec(rb,i);
Break;
end;
end;
end;
if len > rb then
begin
st.Write(buf,rb);
dec(len,rb);
end
else
begin
st.Write(buf,len);
CS.Close;
end;
end;
procedure TForm1.CSDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
st.SaveToFile(ExtractFilePath(Application.ExeName)+'qwqw.jpg');
st.Free;
image1.Picture.LoadFromFile('qwqw.jpg');
end;
end.
Код я так понял что работать должен. Но у меня одна проблема - я работаю через Proxy-сервер... Как мне прописать Proxy и Proxy-port?
P/S.: После нажатия на кнопку сразу выдаётся ошибка: "Asynchronous socket error 10065" и рисунок загружаться не хочет.
seeker (2005-05-25 09:37:00) [8]
> Ну ты ваще...
> Ты ссылку проверял?
> http://www.mota.ru/space/img/space_087.jpgвыдает отнюдь
> не рисунок!
У кого как...
если заменить
str:='GET /nature/img/nature_537.jpg HTTP/1.1'+#13#10+
'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10+
'Referer: http://www.mota.ru/download.php?path=nature&img=537.jpg'+#13#10+
'Accept-Language: ru'+#13#10+
'Accept-Encoding: gzip, deflate'+#13#10+
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+#13#10+
'Host: www.mota.ru'+#13#10+
'Connection: Keep-Alive'+#13#10+#13#10;
на
str:='GET /space/img/space_087.jpg HTTP/1.1'+#13#10+
'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10+
'Referer: http://www.mota.ru/download.php?path=spacee&img=087.jpg'+#13#10+
'Accept-Language: ru'+#13#10+
'Accept-Encoding: gzip, deflate'+#13#10+
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+#13#10+
'Host: www.mota.ru'+#13#10+
'Connection: Keep-Alive'+#13#10+#13#10;
то выдает рисунок.
Вообще нужно знать как защищаются сайты от всякрго рода http запросов.
например, один из способов, работа с броузером не ниже какой-то версии.Тогда нужно самому делать запрос и в строке User-Agent указать кто пытается открыть страницу.
Второй способ, это Referer.Если ты попытаешься открыть страницу с какого-то другого места, то вылетит ошибка.
Ну и "Accept".Это ты сам догадайся...
Slym (2005-05-25 05:19:00) [9]Ну ты ваще...
Ты ссылку проверял?
http://www.mota.ru/space/img/space_087.jpgвыдает отнюдь не рисунок!
seeker (2005-05-24 19:11:00) [10]вот, набросал на скорую руку...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ScktComp;
type
TForm1 = class(TForm)
CS: TClientSocket;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure CSConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
procedure CSDisconnect(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
st:TMemoryStream;
Header:boolean;
Len:integer;
implementation
uses Jpeg;
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
begin
CS.Host:='www.mota.ru';
CS.Port:=80;
CS.Open;
end;
procedure TForm1.CSConnect(Sender: TObject; Socket: TCustomWinSocket);
var
str:string;
begin
st:=TMemoryStream.Create;
str:='GET /nature/img/nature_537.jpg HTTP/1.1'+#13#10+
'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10+
'Referer: http://www.mota.ru/download.php?path=nature&img=537.jpg'+#13#10+
'Accept-Language: ru'+#13#10+
'Accept-Encoding: gzip, deflate'+#13#10+
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+#13#10+
'Host: www.mota.ru'+#13#10+
'Connection: Keep-Alive'+#13#10+#13#10;
Header:=true;
Socket.SendText(str);
end;
procedure TForm1.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf:Array [0..1023] of char;
rb:integer;
str:string;
i:integer;
begin
rb:=Socket.ReceiveBuf(buf,SizeOf(buf));
if Header then
begin
for i:=0 to rb do
begin
str:=str+buf[i];
if pos(#13#10#13#10,str)>0 then
begin
Header:=false;
Str:=copy(str,pos('Content-Length:',str)+length('Content-Length:')+1,length(str));
str:=copy(str,1,pos(#13#10,str)-1);
Len:=StrToInt(str);
move(buf[i+1],buf[0],SizeOf(buf));
dec(rb,i);
Break;
end;
end;
end;
if len > rb then
begin
st.Write(buf,rb);
dec(len,rb);
end
else
begin
st.Write(buf,len);
CS.Close;
end;
end;
procedure TForm1.CSDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
st.SaveToFile('g:\qwqw.jpg');
st.Free;
end;
end.
KonstantinXaker(KX) (2005-05-24 17:09:00) [11]>>Slym ©
Твой код больше похож на правду, но при загрузке рисунка выдаёт ошибку "JPEG error #41" (P.S.: я загружаю JPEG-рисунок. Не BMP и не другой формат)
>>Lex_! ©
Да, ты был прав что там ошибка!
Написал следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
s:TJpegImage;
fs:TFileStream;
strm:TStream;
begin
strm:=TStream.Create;
fs:=TFileStream.Create(idHTTP1.Get(' http://65.200.140.25/ec_metros/ourcams/big_ben.jpg'),fmOpenRead);
fs.CopyFrom(Strm, Strm.Size);
s:=TJpegImage.Create;
s.LoadFromStream(fs);
image1.Picture.Assign(s);
fs.Free;
strm.Free;
end;
Результат тот же - выдаёт ошибку "Cannot open file яШяю"
Что ещё подскажете?
Slym (2005-05-24 06:11:00) [12]
procedure TForm1.Button1Click(Sender: TObject);
var
MemoryStream:TMemoryStream;
JpegImage:TJpegImage;
begin
MemoryStream:=TMemoryStream.Create;
try
idHTTP1.Get(' http://www.mota.ru/space/img/space_087.jpg',MemoryStream);
JpegImage:=TJpegImage.Create;
try
JpegImage.LoadFromStream(MemoryStream);
image1.Picture.Assign(JpegImage);
finally
JpegImage.Free;
end;
finally
MemoryStream.Free;
end;
end;
Lex_! (2005-05-24 05:48:00) [13]и еще...
выше приведен код:
fs.Free;
......
s.LoadFromStream(fs);
эть как?... почему сначала уничтожаем потом со стрима грузим?...
Или я чета не понял ....
Lex_! (2005-05-24 05:00:00) [14]
idHTTP1.Get(' http://www.mota.ru/space/img/space_087.jpg')
в таком виде насколько я понимаю возвращается текст -Function Get(Aurl:string):string
а вот в таком:
Procedure get(AUrl:string; AResponseContent:TStream; AIgnoreReplies: array of smallint)
в принципе можно получить я так подозреваю то что нужно .....
ЗЫ - у меня дельфи 2005 так что у тебя может быть по другому, но в принципе там два ГЕТ, один возвращает строку, второй пишет в стрим...
KonstantinXaker(KX) (2005-05-23 20:14:00) [15]Antonn, выдаёт ту же самую ошибку!
Norny, теперь ощибка другая, но подобного вида: "Cannot open file GIF89a§"
Получается что проблемма не в рисунке, не в ссылке, а в выявлении самого имени рисунка, скачивании его на диск, загрузка в TImage и удаление этого же рисунка с диска!
Как такое реализовать, товарищи?
Norny (2005-05-23 17:21:00) [16]Попробовать с нормальными серверами! Загрузи файл " http://delphimaster.ru/i/star.gif"!
Antonn (2005-05-23 17:20:00) [17]KonstantinXaker(KX) (23.05.05 17:12) [14]
попробуй не с народа.
http://arscity.net.ru/img/silverpl.jpg
KonstantinXaker(KX) (2005-05-23 17:12:00) [18]>> VMcL
С Вами я согласен что ссылка не та. Вот другая ссылка (с моего сайта http://spacehome.narod.ru):
http://www.spacehome.narod.ru/4.jpg
Теперь выдаёт следующую всплывающую ошибку (и так с любым рисунком из интернета!):
"Cannot open file яШяа"
А теперь какой выход из положения?
VMcL (2005-05-23 00:59:00) [19]>> KonstantinXaker(KX)
Ну дык, Вы в браузере откройте эту ссылку. Нет ведь файла, вот сервер и возращает HTML-страницу с описанием ошибки.
KonstantinXaker(KX) (2005-05-22 15:39:00) [20]Сам текст ошибки получил следующим образом:
memo1.Text:=idHTTP1.Get(' http://www.mota.ru/space/img/space_087.jpg')
Напрашивается вопрос - каким образом загрузить сам рисунок?