E, ljudi, kako sa NMHTTPServ (ili kako se vec zove, standardna delphi http serv. komponenta) da prosledim binarni fajl (dakle da ga korisnik downloaduje). Znam sa response da vratim ... tekst, ali kako sliku ili fajl za download da posaljem?
HTTP server problemche
Zaključano
Zakačeno
probaj sa TIndyHTTPServerom, on ima metod ServeFile koji radi sa svim fajlovima koliko znam
Potpis
to dolazi uz D6 enterprise? posto ga na google-u nema, a torry se ne odaziva...
Potpis
hvala, sad cu pogledati pa cu javiti
Potpis
e, uzhas sporo downloaduje ovo... pise 3.7kb a stoji na jednoj poziciji (15%) po 10ak minuta... nesto tu ne stima...
tih 15% - nije uvek isti broj...
edit: ima neki drugi URL?
tih 15% - nije uvek isti broj...
edit: ima neki drugi URL?
Potpis
Uz Delphi 7/2005 dolazi Indy. Mislim da definitivno treba da radis sa njim jer one NMxxx komponente nista ne valjaju. Indy je izmislio mrezu za njih, tako da ga definitivno treba preuzeti. Ja sam probao te NMxxx ranije i imao sam raznih problema, a najvise sto im nedostaje funkcionalnost.
Znaci, brzo na download.... :)
Znaci, brzo na download.... :)
Ljudi, ovako sam uspeo da pozovem download:
i downloaduje mi se nekoime.zip kad pozovem http://localhost:8080/ (imam vec jedan apache na portu 80, pa zato 8080)
E sad, sledeci kod ne radi, a ne znam zasto:
... e 'vako:
kad se pozove samo http://localhost:8080/ on vraca listu nekih fajlova (html.text)... i to radi... kad pozovem http://localhost:8080/?info=ime fajla.mp3, ono vraca tekst iz funkcije DisplayFileInfo, medjutim, kad pozovem http://localhost:8080/?get=ime fajla.mp3 (a edit1.text je npr 'c:\', fale je ime fajla (odstranjuje 'get='), dobijam gresku kako ne moze da otvori fajl, a 100% fajl postoji na odredjenoj lokaciji.
Moze mali tip...?
P.S. Ne komentarisite nacin na koji npr. odsecam string (sa stringreplace), posle cu optimizovati kod i sve ce biti 'po protokolu' :) - zanima me samo kako da pozovem download (mp3) fajla
Code:
var fajl:TStream;
begin
//get file (as stream)
fajl:=TFileStream.Create('c:\arhiva.zip',fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //ne znam tacno koji type za koju ekstenziju, ali sa ovim radi
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename=nekoime.zip');
ResponseInfo.ContentStream:=fajla;
var fajl:TStream;
begin
//get file (as stream)
fajl:=TFileStream.Create('c:\arhiva.zip',fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //ne znam tacno koji type za koju ekstenziju, ali sa ovim radi
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename=nekoime.zip');
ResponseInfo.ContentStream:=fajla;
i downloaduje mi se nekoime.zip kad pozovem http://localhost:8080/ (imam vec jedan apache na portu 80, pa zato 8080)
E sad, sledeci kod ne radi, a ne znam zasto:
Code:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var fale:string;
fajl:TStream;
begin
if RequestInfo.Params.Count = 0 then ResponseInfo.ContentText:=html.Text //if no parameters supplied, list files :)
else begin
//get data
if pos('info=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'info=','',[]);
ResponseInfo.ContentText:=DisplayFileInfo(fale);
end; //eo get data
//send file
if pos('get=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'get=','',[]);
//get file (as stream)
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
end; //eo send
end; //eo else
end;
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var fale:string;
fajl:TStream;
begin
if RequestInfo.Params.Count = 0 then ResponseInfo.ContentText:=html.Text //if no parameters supplied, list files :)
else begin
//get data
if pos('info=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'info=','',[]);
ResponseInfo.ContentText:=DisplayFileInfo(fale);
end; //eo get data
//send file
if pos('get=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'get=','',[]);
//get file (as stream)
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
end; //eo send
end; //eo else
end;
... e 'vako:
kad se pozove samo http://localhost:8080/ on vraca listu nekih fajlova (html.text)... i to radi... kad pozovem http://localhost:8080/?info=ime fajla.mp3, ono vraca tekst iz funkcije DisplayFileInfo, medjutim, kad pozovem http://localhost:8080/?get=ime fajla.mp3 (a edit1.text je npr 'c:\', fale je ime fajla (odstranjuje 'get='), dobijam gresku kako ne moze da otvori fajl, a 100% fajl postoji na odredjenoj lokaciji.
Moze mali tip...?
P.S. Ne komentarisite nacin na koji npr. odsecam string (sa stringreplace), posle cu optimizovati kod i sve ce biti 'po protokolu' :) - zanima me samo kako da pozovem download (mp3) fajla
Potpis
Pa prvo dodaj kod koji ce proveriti o kakvom nazivu fajla se radi.
Znaci ubaci:
Sada vidi sta ti vraca kao naziv fajla. Onda mozemo dalje. Zasto stavljas PChar u TFileStream.Create()? Skini i to.
Znaci ubaci:
Code:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var fale:string;
fajl:TStream;
begin
if RequestInfo.Params.Count = 0 then ResponseInfo.ContentText:=html.Text //if no parameters supplied, list files :)
else begin
//get data
if pos('info=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'info=','',[]);
ResponseInfo.ContentText:=DisplayFileInfo(fale);
end; //eo get data
//send file
if pos('get=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'get=','',[]);
//get file (as stream)
ResponseInfo.ContentText:= '<HTML>"'+Edit1.Text+fale+'"</HTML>';
{
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
}
end; //eo send
end; //eo else
end;
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var fale:string;
fajl:TStream;
begin
if RequestInfo.Params.Count = 0 then ResponseInfo.ContentText:=html.Text //if no parameters supplied, list files :)
else begin
//get data
if pos('info=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'info=','',[]);
ResponseInfo.ContentText:=DisplayFileInfo(fale);
end; //eo get data
//send file
if pos('get=',RequestInfo.Params.Text)>0 then begin
fale:=StringReplace(RequestInfo.Params.Text,'get=','',[]);
//get file (as stream)
ResponseInfo.ContentText:= '<HTML>"'+Edit1.Text+fale+'"</HTML>';
{
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
//download it
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
}
end; //eo send
end; //eo else
end;
Sada vidi sta ti vraca kao naziv fajla. Onda mozemo dalje. Zasto stavljas PChar u TFileStream.Create()? Skini i to.
Vraca mi ovo:
"D:\muzika\Reggae\10 C'C'\10 C'C' - Dreadlock holliday.mp3 "
Isto tako unesem u Total Commander, pritisnem enter, i Winamp pusti pesmu (znaci u redu je).
Skinuo sam i pchar, ali isti slucaj...
imam jos jedan problem u ovom projektu, sa racunanjem velicine fajla, ali o tome cemo posle... (a na istu foru, kad stavim da izracuna velicinu nekog fajla on lepo odradi to, a u funkciji DisplayFileInfo pokazuje -1, kao da fajl ne postoji)
"D:\muzika\Reggae\10 C'C'\10 C'C' - Dreadlock holliday.mp3 "
Isto tako unesem u Total Commander, pritisnem enter, i Winamp pusti pesmu (znaci u redu je).
Skinuo sam i pchar, ali isti slucaj...
imam jos jedan problem u ovom projektu, sa racunanjem velicine fajla, ali o tome cemo posle... (a na istu foru, kad stavim da izracuna velicinu nekog fajla on lepo odradi to, a u funkciji DisplayFileInfo pokazuje -1, kao da fajl ne postoji)
Potpis
PChar je sporedna stvar u svemu samo sam zapazio. Totalno sam zaboravio da pitam ko ti i gde prijavljuje gresku: Da li to radi
TFileStream.Create() ili
je problem u:
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
jer tu prosledjujes putanju do fajla a ne sam naziv fajla...
itd.
Ajde sad...
TFileStream.Create() ili
je problem u:
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
jer tu prosledjujes putanju do fajla a ne sam naziv fajla...
itd.
Ajde sad...
to sam vec video (da je path) i ispravio, a gresku prijavljuje:
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
...to prijavljuje gresku, a u browser-u se ispise: Cannot open file D:\muzika\Reggae\Aswad\Live\Aswad - Drumm Bass Line.mp3
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
...to prijavljuje gresku, a u browser-u se ispise: Cannot open file D:\muzika\Reggae\Aswad\Live\Aswad - Drumm Bass Line.mp3
Potpis
Pa cini mi se da je cudno da tu dize exception jer onda ne bi mogao da izvrsi linije ispod TFileStream.Create() vec bi iskocio iz procedure na tom mestu i onda se postavlja pitanje kako browser uposte moze da napise onu poruku?
Code:
...
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
// ovo na dole se ne izvrsava ako je na prethodnoj liniji doslo do izuzetka.
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
end; //eo send
...
fajl:=TFileStream.Create(pchar(edit1.text+fale),fmOpenRead);
// ovo na dole se ne izvrsava ako je na prethodnoj liniji doslo do izuzetka.
ResponseInfo.ContentType:='application/zip'; //zips are downloaded
ResponseInfo.Headers.Add('Content-Disposition: attachment; filename='+ExtractFilePath(edit1.text+fale));
ResponseInfo.ContentStream:=fajl;
end; //eo send
pa da, tek kad u delphiju ponovo pritisnem `play`, onda se ispise ono u browser-u
Sve mi je ovo cudno, jer fajl POSTOJI na odredjenoj lokaciji!!
Sve mi je ovo cudno, jer fajl POSTOJI na odredjenoj lokaciji!!
Potpis
Resenje tvog problema je:
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
Code:
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
Code:
...
begin
MetodA;
MetodB;
MetodC;
end...
...
begin
MetodA;
MetodB;
MetodC;
end...
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
Resenje tvog problema je:
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
Code:
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
Code:
...
begin
MetodA;
MetodB;
MetodC;
end...
...
begin
MetodA;
MetodB;
MetodC;
end...
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
Resenje tvog problema je:
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
Code:
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
fale:=Trim(StringReplace(ARequestInfo.Params.Text,'get=','',[]));
fajl:=TFileStream.Create(edit1.text+fale,fmOpenRead);
ovo radi kod mene. Znaci razmak koji se pojavljuje na kraju naziva treba skinuti.
A sto se tice izuzetka, on kada se desi u proceduri u metodu A:
Code:
...
begin
MetodA;
MetodB;
MetodC;
end...
...
begin
MetodA;
MetodB;
MetodC;
end...
i nije tamo obradjen onda se metode B i C uposte ne izvrsavaju vec se iskace iz procedure. Trazi se prvi sledeci handler izuzetaka koji je definisan itd.
pogledacu kasnije kad budem imao vremena pa cu ti javiti, ali verujem ja u tebe :)
edit: radi, hvala ti mnogo, mnogo
edit: radi, hvala ti mnogo, mnogo