[ Nemanja Avramović @ 10.02.2005. 22:30 ] @
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?
[ bancika @ 10.02.2005. 23:12 ] @
probaj sa TIndyHTTPServerom, on ima metod ServeFile koji radi sa svim fajlovima koliko znam
[ Nemanja Avramović @ 10.02.2005. 23:25 ] @
to dolazi uz D6 enterprise? posto ga na google-u nema, a torry se ne odaziva...
[ bancika @ 10.02.2005. 23:55 ] @
http://downloads.atozedsoftware.com/indy/indy10.0.52_d7.exe
[ Nemanja Avramović @ 11.02.2005. 00:22 ] @
hvala, sad cu pogledati pa cu javiti
[ Nemanja Avramović @ 11.02.2005. 00:51 ] @
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?
[ morlic @ 11.02.2005. 09:18 ] @
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.... :)
[ Nemanja Avramović @ 11.02.2005. 13:50 ] @
Ljudi, ovako sam uspeo da pozovem download:
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;


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;


... 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
[ morlic @ 12.02.2005. 09:50 ] @
Pa prvo dodaj kod koji ce proveriti o kakvom nazivu fajla se radi.
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;


Sada vidi sta ti vraca kao naziv fajla. Onda mozemo dalje. Zasto stavljas PChar u TFileStream.Create()? Skini i to.
[ Nemanja Avramović @ 12.02.2005. 12:53 ] @
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)
[ morlic @ 12.02.2005. 19:55 ] @
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...


[ Nemanja Avramović @ 12.02.2005. 22:30 ] @
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
[ morlic @ 12.02.2005. 23:15 ] @
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


[ Nemanja Avramović @ 12.02.2005. 23:46 ] @
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!!
[ morlic @ 13.02.2005. 11:58 ] @
Resenje tvog problema je:

Code:

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...


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.
[ morlic @ 13.02.2005. 12:03 ] @
Resenje tvog problema je:

Code:

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...


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.
[ morlic @ 13.02.2005. 12:04 ] @
Resenje tvog problema je:

Code:

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...


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.
[ Nemanja Avramović @ 13.02.2005. 13:45 ] @
pogledacu kasnije kad budem imao vremena pa cu ti javiti, ali verujem ja u tebe :)

edit: radi, hvala ti mnogo, mnogo