Προς το περιεχόμενο

Delphi και ftp ( indy ) upload file


Προτεινόμενες αναρτήσεις

Δημοσ.

FTP:TIdFTP;

--------------

FTP.Host := 'users.sch.gr';

FTP.Port := 80;

FTP.Username := 'user123';

FTP.Password := '12345678';

 

FTP.Connect;

if FTP.Connected then begin

FTP.ChangeDir('test');

FTP.Put('f:\123.txt','123.txt',true);

FTP.Quit;

FTP.Disconnect;

end;

 

Μάλλον γίνεται σύνδεση (περιμένω πολύ ώρα) και

στο τέλος μου λέει ότι η σύνδεση διακόπηκε χαριτωμένα.

Τι κάνω λάθος? (Προσπαθώ να κάνω upload αρχεία)

Αισθάνομαι ότι κάτι δεν πάει καλά με username ή password.

Δημοσ.

EIdConnClosedGracefully error raised, with message : Connection Closed Gracefully.

 

Μετά το FTP.Connect;

έχω το CAPTION:='2';

όπου δεν εμφανίζεται. Αρα το το FTP.Connect αποτυγχάνει.

Είναι σε DELPHI 7

Δημοσ.

δες αυτο...

http://www.swissdelphicenter.ch/en/showarticle.php?id=1

με το simple solution, λογικα δεν θα εχεις προβλημα.

 

Because the EIdConnClosedGracefully is a common exception especially with certain servers it descends from EIdSilentException. On the Language Exceptions tab of Debugger Options (Tools Menu) you can add EIdSilentException to the list of exceptions to ignore. After this is added the exceptions will still occur in the code and be handled, but the debugger will not stop the program to debug them.

 

και συγχωρεσε με που θα επιμεινω αλλα ποσο το εχεις το timeout?

 

Και επισης δοκιμασε και αυτο...

try

FTP.Connect;

except on E : Exception do

if E is EIdConnClosedGracefully then

else

raise;

end;

Δημοσ.

Το διάβασα και εγώ αυτό από το SwissDelphi.... (το έβαλα όπως έλεγε να είναι εκτός)

Ταυτόχρονα με κάποιες δοκιμές που κάνω (δεν ξέρω ποιες) κολλάει μάλλον το router της HOL και δεν έχω internet,

οπότε έκανα και 3-4 reset(μπρίζα).

 

Κατάφερα (δεν ξέρω πως) να περάσω και το

if FTP.Connected then begin

FTP.ChangeDir('test');

FTP.Put('f:\123.txt','123.txt',true);

είμαι κάπου εδώ. Δεν ξέρω αν το κάνει τελικά upload.

Ενα από τα τελευταία λάθη που πήρα ήταν :

class EIdSocketError with message 'Socket Error # 10054 Connection reset by peer.

 

"και συγχωρεσε με που θα επιμεινω αλλα ποσο το εχεις το timeout?"

Τι και πως ακριβώς να δω ?

Οσο για ερωτήσεις, κάνε ότι θες (Καμμιά φορά από βλακεία και μάλιστα μεγάλη δεν δουλεύουν).

 

Ασχετο αλλά δεν μπορώ.

Βλέπω ειδήσεις και ακούω πάλι για μάχες των πολιτικών για 13-14 μισθό.

Εχετε δει πουθενά αεροπλάνα, κανόνια, πολυβόλα κλπ ? Τι διάολο μάχες είναι αυτές?

Δημοσ.

αυτο που σου βγαζει σημαινει πως προσπαθει να σε κανει redirect και πιστευω πως φταιει το ChangeDir που του δινεις.

Προσπαθησε να το προσθεσεις κι αυτο μεσα στα exceptions του debugger καθως απο οσο διαβαζα στο embarcadero, το διαχειριζετε εσωτερικα το Indy comp.

Το timeout θα το βρεις στα properties του component, στα αριστερα.

Δημοσ.

Λοιπόν, ReadTimeout =0 (default).

 

Εϊμαι έτοιμος για δοκιμή αλλά φοβάμαι πάλι το router της HOL.

Δεν αποκλείεται η περίεργη συμπεριφορά σφαλμάτων που έχω να οφείλεται στο router της HOL.

Το λέω γιατί πριν καιρό προσπάθησα να φτιάξω τον Total Commander για ftp και

έφτανα σε σημείο που ήθελε το router reset(μπρίζα).

Καλά είχα το fritz, αλλά μου το άλλαξαν και έφεραν ένα άλλο.

Δημοσ.

καλησπερα

Φιλε μου δοκιμασε το σε Επιπεδο .Να σιγουρευτεις

Αν θες λίγο εξήγηση παραπάνω.

Τι σημαίνει "σε Επιπεδο" ?

 

Υπάρχει άλλος τρόπος μέσω Delphi 7 ?

Δημοσ.

Δοκιμασες το server με κάποιον FTP client και αποδεδειγμένα δουλεύει? Μήπως το port θα έπρεπε να είναι κάποιο άλλο (20 ή 21 ας πούμε)?

Δημοσ.

Ενοοω

Τρεχε και τα δυο κομματια(Client-server)στο μηχανημα σου .συνδεσου και τσεκαρισε αν δουλευει

Δημοσ. (επεξεργασμένο)

Σίγουρα έχω σύνδεση με ftp.

Και μέσω link από το "Θέσεις δικτύου" και από το WinSCP.

Αν είμαι συνδεδεμένος με άλλο τρόπο μου λέει (το Delphi) ότι είμαι ήδη συνδεδεμένος.

Οσο για τις πόρτες δοκίμασα με 21 και με 80.

Το 80 το βρήκα με Php που έφτιαξα, ότι είναι του server.

Ελπίζω να απάντησα σε όλα.

 

Το σίγουρο είναι ότι σχεδόν με κάθε δοκιμή το router θέλει reset(μπρίζα).

Αρα δεν μπορώ να είμαι σίγουρος για τα σφάλματα που παίρνω.

Θεωρώ πιθανότερο πρόβλημα το router που δεν μ΄αφήνει να καταλάβω τι γίνεται.

 

@Directx θα το κοιτάξω.

 

----------------------------------------------------------------------------------------

 

Τελικά ...

http://www.delphibasics.info/home/delphibasicssnippets/httpfileuploadbytheunxplained

Delphi + Php.

Εκανα test και πέτυχε.

Βιαστικά που είδα χρησιμοποιεί το form html μέσω του Delphi, χωρίς να πρέπει να κάνεις

κλικ ή οτιδήποτε άλλο. (uses Windows, WinSock, SysUtils;)

Θα το απλοποιήσω και θα σας το γράψω.

Επεξ/σία από smilefreeware
Δημοσ.

Για όσους ενδιαφέρονται σας δίνω μια function και τέλος.

Η μέθοδος αυτή είναι ίδια με την Html+form.

Απλώς δεν χρειάζονται διάφορα κλικ μη τυχόν και έχουμε "τρύπα" στον Explorer.

Βέβαια πρέπει να φτιάξετε και ένα αρχείο Php.

 

Upload file with Delphi (WinSock)

>
function UpLoadFile(Host,PhpUrl,FileName:string):integer;
{
from http://www.delphibasics.info/home/delphibasicssnippets/httpfileuploadbytheunxplained
uses WinSock

upload.php file // data=formName , variable following
<?php
move_uploaded_file($_FILES['data']['tmp_name'], $_FILES['data']['name']) or die('');
?>
}

function GetIPFromHost(const HostName:string):string;
type TaPInAddr=array[0..10] of PInAddr; PaPInAddr=^TaPInAddr;
var  phe:PHostEnt; pptr:PaPInAddr; i:Integer; GInitData:TWSAData;
begin
 WSAStartup($101,GInitData); Result:= '';
 phe:=GetHostByName(PChar(HostName));
 if phe=nil then Exit;
 pPtr:=PaPInAddr(phe^.h_addr_list); i:=0;
 while pPtr^[i] <> nil do begin
   Result:=inet_ntoa(pptr^[i]^); Inc(i);
 end;
 WSACleanup;
end;

function readFiletoString(fpath:string; var fbuffer:string):boolean;
var fhandle: Thandle; dSize: DWORD; dRead: DWORD;
begin
 Result:= False;
 fhandle := CreateFile(PChar(fpath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if fhandle <> 0 then begin
   dSize := GetFileSize(fhandle, nil);
   if dSize<>0 then begin
     SetFilepointer(fhandle,0,nil, FILE_BEGIN);
     SetLength(fbuffer, dSize);
     if ReadFile(fhandle, fbuffer[1],dSize, dRead, nil) then Result:= True;
     CloseHandle(fhandle);
   end;
end;
end;

var
 sSock:TSocket; sAddr:TSockAddrIn; sWsa:TWSAData;
 sPort,rturn:integer;
 data,fileContents,bodySize,bodyContents,hostIp,boundary,formName :string;
 filePath,remotefilename,script :string;

begin
sPort:=80;
formName:='data';

filePath:=FileName;
remotefilename:=ExtractFileName(FileName);
script:=PhpUrl;

boundary:='---------------------------282861610524488';
//read file
if not readFiletoString(filePath,fileContents) then begin
 Result :=-1; exit;
end;

bodyContents := '--' + boundary + #13#10;
bodyContents := bodyContents + 'Content-Disposition: form-data; name="'+formName+'"; filename="'+ remotefilename +'"';
bodyContents := bodyContents + #13#10 + 'Content-Type: application/octet-stream';
bodyContents := bodyContents + #13#10 + #13#10 + fileContents + #13#10;
bodyContents := bodyContents  + '--'+ boundary + '--' + #13#10;
bodySize := IntToStr(Length(bodyContents));

//generate headers and body
data := 'POST ' + script +' HTTP/1.1' + #13#10 + 'Host: ' + host  +#13#10;
data := data + 'User-Agent: Uploador' + #13#10;
data := data + 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10;
data := data + 'Content-Type: multipart/form-data; boundary=' + boundary + #13#10;
data := data + 'Connection: Keep-Alive' + #13#10;
data := data + 'Content-Length: ' + bodySize + #13#10 + #13#10;
data := data + bodyContents;

WSAStartup($1010, sWsa);
sSock := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

//get ip from hostname
hostIp := GetIpFromHost(host);

if  hostIp = '' then begin
 Result:=-2; Exit;
end;

sAddr.sin_family := AF_INET;
sAddr.sin_port := hTons(sPort);
sAddr.sin_addr.S_addr := inet_addr(PChar(hostIp));

rturn := connect(sSock, sAddr, SizeOf(sAddr));

if rturn = SOCKET_ERROR then begin
 Result:=-3; exit;
end else begin
 rturn:=send(sSock, data[1], Length(data), 0);
 Sleep(4000);
 closesocket(sSock);
 Result:=0;
end;

end;

//----------------------------------------------------------------------------------------------

//... Example ...
//function UpLoadFile(Host, PhpUrl, FileName :string):integer;
X:=UpLoadFile('users.sch.gr','/vasanagno/up/upload.php','C:\up\abcd.txt');
case X of
 0: MessageBox(0,'File Uploaded!', 'Success', MB_OK);
-1: MessageBox(0,'Error reading file', 'Error', MB_OK);
-2: MessageBox(0,'Error resolving host', 'Error', MB_OK);
-3: MessageBox(0, 'Error connecting to host', 'Error', MB_OK);
end;

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...