Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei per FTP hochladen (https://www.delphipraxis.net/148689-datei-per-ftp-hochladen.html)

zod1ac 6. Mär 2010 12:43


Datei per FTP hochladen
 
Hey,

ich sollte einen neuen Thread erstellen, also hier mein Anliegen:

Ich habe EditFelder und nach Betätigen des Buttons werden die Inhalte dieser Felder in einer Textadtei gespeichert, doch wie bekomm ich diese nun auf einen FTP Server? Ich habe gerade einiges über idFTP gelesen, doch ich verstehe nicht wie ich es benutzen soll. Hab es mir gerade heruntergeladen - naja ich verstehs nicht so ganz.

Ich habe bereits einen FTP und möchte die .txt nun darauf hochladen, wie bekomme ich das mit idFTP hin, wie installiere ich es? Oder gibt es auch noch andere Methoden?

danke nochmals für eure Hilfe! :)


Edit: Tut mir Leid, ich habs in der falschen Rubrik erstellt :/

s.h.a.r.k 6. Mär 2010 12:46

Re: Datei per FTP hochladen
 
Was für eine Delphi-Version hast du denn? Normalerweise sind da die Indy-Komponenten schon an Board und da ist eine solche FTP-Komponente enthalten. Würde mich auch wundern, wenn hier im Forum nichts darüber zu finden wäre, wie man diese nutzt :zwinker:

zod1ac 6. Mär 2010 12:56

Re: Datei per FTP hochladen
 
Ich habe Delphi 2010, ich glabue da ist sie bereits schon da, also ich hab TidFTP bereits gefunden, doch weiter weiß ich leider nich =(

DeddyH 6. Mär 2010 12:59

Re: Datei per FTP hochladen
 
Wenn man nach "IdFTP" und "hochladen" sucht, stößt man beispielsweise auf diesen Thread: http://www.delphipraxis.net/internal...t.php?t=115833

s.h.a.r.k 6. Mär 2010 13:01

Re: Datei per FTP hochladen
 
Stell mal etwas präzisere Fragen, dann kann dir auch besser geholfen werden.

Was mir dies bzgl einfällt: zieh die Komponente auf deine Form und stelle in den Eigenschaften die IP-Adresse deines FTP-Servers ein (in so fern dieser eine feste hat). Du kannst auch ein Edit auf die Form klatschen, in der der User die Adresse (darf natürlich auch eine Domain sein) eingeben darf. Dann musst du halt zur Laufzeit sowas wie IdFTP1.Server := Server machen. Ich würde behaupten, dass der Port eigentlich passt, da bei FTP Port 21 Standard ist und seltenst ein anderer genutzt wird. Eine Verbindung wirst du mit Connect aufbauen und folglich mit Disconnect wieder schließen können.

Btw: Hast du wirklich die Suche bemüht? :gruebel: Hab auf Anhieb diesen Thread gefunden.

zod1ac 6. Mär 2010 13:04

Re: Datei per FTP hochladen
 
Tausend Dank!! :)

Also ich dachte an Funpic oder auch ohost, da diese ja kostenlos Webspace zur Verfügung stellen und ein FTP Zugang somit auch vorhanden ist. Ich werd mir gleich noch diesen Thread reinziehen und hoffe auch, dass es anschließend klappt, danke nochmals für die Hilfe, aber auch Geduld mit mir :P

mfg

zod1ac 6. Mär 2010 13:29

Re: Datei per FTP hochladen
 
Also ich habs grad versucht umzusetzen, beim Compilieren treten keine Probleme auf, doch wenn ich es Testen will, kommt folgende Meldung:


"Project Project1.exe raised exception class EClassNotFound with message "Class TidFTP not found"."

Also ich muss die Class oben noch deklarieren oder wie soll ich das verstehen?

DeddyH 6. Mär 2010 13:32

Re: Datei per FTP hochladen
 
Füg einmal IdFtp der uses-Klausel hinzu.

zod1ac 6. Mär 2010 13:37

Re: Datei per FTP hochladen
 
Ist da bereits vorhanden, hier mein kompletter Quelltext:

Delphi-Quellcode:
nit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFtp, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

      ftp: TidFtp;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

with ftp do
begin
  try
    Host := '......funpic.de';
    Username := 'benutzername';
    Password := 'pw';
    Passive := true;
    Connect;
    Put('C:\text.txt', 'text.txt', false);
    Disconnect;
  finally
    ftp.Free;
  end;
end;
end;

end.

DeddyH 6. Mär 2010 13:40

Re: Datei per FTP hochladen
 
ftp wird ja nirgends erzeugt, dafür aber freigegeben.

s.h.a.r.k 6. Mär 2010 13:41

Re: Datei per FTP hochladen
 
Was soll mit dem Quelltext sein? Kommt ein Fehler? Ist das die fertige Lösung, die funktioniert?

zod1ac 6. Mär 2010 13:46

Re: Datei per FTP hochladen
 
Zitat:

Zitat von DeddyH
ftp wird ja nirgends erzeugt, dafür aber freigegeben.

Inwiefern erzeugt? Es soll ja eine Verbindung zum FTP hergestellt werden, also was genau muss ich noch hinzufügen?

habs grad mit TidFTP.Create probiert nach Begin klappt aber auch nicht, kommt die gleiche Fehlermeldung.

DeddyH 6. Mär 2010 13:47

Re: Datei per FTP hochladen
 
Jetzt geht mir ein Licht auf: Du hast eine IdFTP-Komponente aufs Formular gezogen und dann die Deklaration nach private verschoben, richtig? Mach das mal wieder rückgängig.

zod1ac 6. Mär 2010 13:52

Re: Datei per FTP hochladen
 
Soll ich sie ganz rausnehmen oder wohin soll ich sie verschieben?

DeddyH 6. Mär 2010 13:56

Re: Datei per FTP hochladen
 
Also hast Du die Komponente auf dem Formular? Dann so:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    ftp: TidFtp; //hierhin
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }     
  public
    { Public declarations }
  end;

zod1ac 6. Mär 2010 14:04

Re: Datei per FTP hochladen
 
So oke an sich ist das Problem jetzt zwar behoben, doch nun kommt eine Meldung:

"Field.Form1.ftp does not have a corresponding component.Remove the declaration?"

Heißt es, dass der FTP nicht geht?

DeddyH 6. Mär 2010 14:07

Re: Datei per FTP hochladen
 
Wenn das eben gepostete der gesamte Quelltext war scheint es mir das Einfachste, Du fängst von vorn an: neues Formular, da eine TIdFTP und Deinen Button drauf, Eigenschaften im OI einstellen und im ButtonClick das Put aufrufen.

zod1ac 6. Mär 2010 14:11

Re: Datei per FTP hochladen
 
Ja wahrscheinlich schon^^

Aber hier nochmal mein kompletter Quelltext, vllt habe ich ja auch die falsche FTP Adresse eingegeben, was ich aber nicht glaube naja, solange ich von vorne anfange hier nochma das Ganze:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdFtp, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdExplicitTLSClientServerBase;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ftp: TidFTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public declarations }

  end;

  var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

with ftp do
begin
  try
    Host := ' ftp://kidgudi.ki.funpic.de/';
    Username := 'kidgudi';
    Password := '*****';
    Passive := true;
    Connect;
    Put('C:\text.txt', 'text.txt', false);
    Disconnect;
  finally
    ftp.Free;
  end;
end;
end;

end.

Klaus01 6. Mär 2010 14:14

Re: Datei per FTP hochladen
 
Mahlzeit,

den Host bitte ohne "FTP://"

Das "FTP://" benötigt nur ein Webbrowser damit er weiß das er nun mit einem
FTP Server spricht.

Grüße
Klaus

zod1ac 6. Mär 2010 14:16

Re: Datei per FTP hochladen
 
Es funktioniert, vielen Dank. Du hast mir wirklich sehr geholfen, danke nochmals!!! :cheer: :cheer:

DeddyH 6. Mär 2010 14:30

Re: Datei per FTP hochladen
 
Und lass das Free weg, sonst knallt es ganz gehörig beim nächsten Klick auf den Button oder beim Programmende.

zod1ac 6. Mär 2010 14:37

Re: Datei per FTP hochladen
 
Hm, da erscheint wieder dieser Fehler:

"Field.Form1.ftp does not have a corresponding component.Remove the declaration?"

Ich hab alles nochmal von vorne aufgesetzt, aber leider kein Erfolg. Ich habe lediglich 2 EditFelder hinzugefügt und ein TString eingebaut. Also hier nochmal mein neuer Quelltext, beide Programme funktionierten unabhängig voneinander zwar, aber wenn man sie zusammen benutzt, leider nicht:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    ftp: TidFTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var sl:TStrings;
begin
  sl:=TStringList.Create;
  sl.Add(Edit1.text);
  sl.Add(Edit2.text);
  sl.SaveToFile('C:\text.txt');
  sl.Free;

with ftp do
 begin
   try
    Host :='kidgudi.ki.funpic.de';
    Username := 'kidgudi';
    Password := '*****';
    Passive := true;
    Connect;
    Put('C:\text.txt', 'text.txt', true);
    Disconnect;
    finally

   end;
 end;
end;


end.

DeddyH 6. Mär 2010 14:42

Re: Datei per FTP hochladen
 
Häng doch bitte mal die *.pas und die *.dfm an.

zod1ac 6. Mär 2010 14:49

Re: Datei per FTP hochladen
 
http://www.fileuploadx.de/251631

Hier ist mein kompletter Ordner mit dem Projekt darin.

Ich hoffe ihr könnt mir helfen, ich verzweifle langsam^^

Sir Rufo 6. Mär 2010 14:51

Re: Datei per FTP hochladen
 
Zitat:

Zitat von zod1ac
http://www.fileuploadx.de/251631

Hier ist mein kompletter Ordner mit dem Projekt darin.

Ich hoffe ihr könnt mir helfen, ich verzweifle langsam^^

Warum hängst du die Datei nicht an den Thread dran????

Wenn du den Namen der Komponente im Quelltext änderst, dann darfst du dich auch nicht wundern!

Du hast IdFtp1 umbenannt in ftp ...

Mach das über den Objekt-Inspektor ... dann kriegen auch alle mit, dass der Name geändert werden soll

DeddyH 6. Mär 2010 14:52

Re: Datei per FTP hochladen
 
In der *.dfm heißt die Komponente IdFTP1 und in der *.pas ftp. Wenn Du Komponenten umbenennst, dann mach das immer über den Objektinspektor. Übrigens: Du kannst auch direkt hier in der DP Dateien an Deinen Beitrag anhängen.

zod1ac 6. Mär 2010 14:58

Re: Datei per FTP hochladen
 
Es funktioniert top, vielen vielen Dank. Ihr habt mir echt geholfen, vor allem du DeddyH dir einen ganz großen Dank, es läuft einwandfrei. Merci ;)

lg

zod1ac 7. Mär 2010 00:04

Re: Datei per FTP hochladen
 
Hey, ich bins wieder :pale:

Wie gesagt, funktioniert es bei mir einwandfrei. Doch ich glaube das bezieht sich nur auf Local oder?
Ich habs meinem Freund geschickt, er sollte was in die Edit Felder eintippen, doch anschließend kam:

"cannot create file "C:\test.txt". Zugriff verweigert."

Ich glaube das Programm hat keine Rechte eine Textdatei auf einem anderen System zu erstellen, oder sehe ich das falsch? Doch wie kann man dieses Problem umgehen? Gibt es da eine andere Alternative?


mfg

Sir Rufo 7. Mär 2010 00:15

Re: Datei per FTP hochladen
 
Zitat:

Zitat von zod1ac
"cannot create file "C:\test.txt". Zugriff verweigert."

Eine Datei direkt im Pfad "C:\" zu erstellen ist ja auch extrem eklig.

Woher weißt du ob es den Pfad "C:\" auf dem Zielsystem gibt? (Ich bin nicht gezwungen mein System auf C: zu installieren!)
Woher weißt du ob du in dem Pfad "C:\" Schreibrechte hast?

Es gibt dafür eine "Styleguide" von Microsoft "Where to put the fu**ing data-files"

Schaue nach Hier im Forum suchenSpecial Folders MSDN-Library durchsuchenSpecial Folders Bei Google suchenDelphi Special Folders

zod1ac 7. Mär 2010 00:25

Re: Datei per FTP hochladen
 
Ja genau, das hab ich mir auch gedacht, wie kann ich herausfinden, WO genau ich denn Schreibrechte habe und wo nicht?

Also dieser Befehl schafft Abhilfe?


Edit: Ich hab grad einiges über Special Folders gelesen und das scheint ja eine richtig komplizierte Sache zu werden. Gibts denn nichts anderes? Also gibts keinen Platz auf dem es im Normalfall Schreibrecht gibt?

lg

Sir Rufo 7. Mär 2010 00:38

Re: Datei per FTP hochladen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von zod1ac
Ja genau, das hab ich mir auch gedacht, wie kann ich herausfinden, WO genau ich denn Schreibrechte habe und wo nicht?

Also dieser Befehl schafft Abhilfe?


Edit: Ich hab grad einiges über Special Folders gelesen und das scheint ja eine richtig komplizierte Sache zu werden. Gibts denn nichts anderes? Also gibts keinen Platz auf dem es im Normalfall Schreibrecht gibt?

lg

Die Special Folders sagen dir noch nicht, ob du da Schreibrechte hast.
Du bekommst nur die Pfadangaben geliefert.

Bei einigen Pfaden kann man aber davon ausgehen, dass der aktuelle Benutzer dort Schreibrechte haben sollte, sonst könnte der nämlich nicht vernünftig arbeiten :mrgreen:

Kompliziert ist das nicht wirklich ... dafür gibt es fertige Units womit man das auslesen kann.
Die Jedi's haben da einiges im Programm.

Ich habe dir mal eine Unit angehängt, die diese Special Folders mit einfachen Befehlen erschlägt :mrgreen:
Zudem ist in der Unit auch eine Funktion, die dir die Rechte in dem Verzeichnis oder an einer Datei zurückliefert.

Eine Demo ist auch dabei, da werden alle Special Folders aufgelistet inkl. der Rechte.

zod1ac 7. Mär 2010 00:53

Re: Datei per FTP hochladen
 
Vielen Dank dafür erstma, doch wie genau binde ich das nun in meinen Quelltext ein?
Also was genau muss ich denn jetzt machen? Habs jetzt soweit verstanden, dass SpecialFolders mir die Ordner anzeigt, die Schreibrecht haben usw.

Doch was nun? Wie genau bau ich das nun ein?

Sir Rufo 7. Mär 2010 01:29

Re: Datei per FTP hochladen
 
z.B. so (ich habe mal die schönen Eigenheiten der Unit hier benutzt :mrgreen: )
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    IdFTP1: TidFTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations } 
  public
    { Public declarations } 
  end;

var
  Form1: TForm1;

implementation

uses

  // Unit einbinden

  uSpecialFolders;

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject);
var sl:TStrings;
begin

  // Temporäres Verzeichnis für diese App erstellen

  if
    ForceDirectories( ResolveSFVars( '{appdatatemp}' ) )
  then
    begin
      sl := TStringList.Create;
      try
        sl.Add(Edit1.text);
        sl.Add(Edit2.text);
        sl.SaveToFile( ResolveSFVars( '{appdatatemp}\text.txt' ) );
      finally
        sl.Free;
      end;
     
      with IdFTP1 do
        begin
          Host :='kidgudi.ki.funpic.de';
          Username := 'kidgudi';
          Password := '*****';
          Passive := true;
          Connect;
          Put( ResolveSFVars( '{appdatatemp}\text.txt' ), 'text.txt', true);
          Disconnect;
        end;

      // Temporäres Verzeichnis aufräumen und löschen
      DeleteAndEmptyDir( '{appdatatemp}' );

    end
  else
    ShowMessage( 'Temporäres Verzeichnis konnte nicht erstellt werden!' );
end;

end.

zod1ac 7. Mär 2010 02:04

Re: Datei per FTP hochladen
 
Oke um die Unit uSpecialFolders einzubinden, muss sie sich im gleichen Ordner befinden, wie die normale Unit1 auch? Oder ist das egal?

Also habs soweit miteinbezogen, doch nun kommt die Fehlermeldung:

Exception class EIdReplyRFCError with message 'text.txt: Append/Restart not permitted, try again'.

Was nun? =(


Update:

Fehlermeldung scheint weg zu sein, funktioniert alles einwandfrei. Danke ;)

JDouble 18. Mär 2010 16:51

Re: Datei per FTP hochladen
 
Hallo

Ich versuche mit der TIdFTP-Komponente via Put einige größere Dateien hochzuladen.
Das heißt ich führe den Connect durch und rufe anschließend in einer Schleife mehrmals hintereinander Put auf.

Leider kommt es dann immer mal wieder vor, dass die Verbindung unterbrochen wird.
Bei der Protokollierung über das OnStatus-Ereignis erhalte ich dann als Meldungstext "Disconnected".

Wie geht man in so einem Fall am besten vor ?
Kann man einfach erneut Connect aufrufen (innerhalb der OnStatus-Behandlung) ?

Oder wie macht ihr das ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz