Entwickler-Ecke

Internet / Netzwerk - Datei-POST mit Indy


K.S.M. - So 07.03.10 18:41
Titel: Datei-POST mit Indy
Hallo Delphi-Forum :)

Ich habe ein Problem, und zwar möchte ich gerne eine binäre Datei mithilfe eines Posts und TidHTTP uploaden. Sie sollte dann in PHP mit

Quelltext
1:
2:
3:
4:
5:
<?PHP

  $_FILE[ 'content' ]

?>

o. ä. abgerufen werden können. Ich habe leider bisher noch keine vernünftige Lösung gefunden. Weiß jemand, wie man das machen kann oder hat eine Idee?

Liebe Grüße,
K.S.M. ;)


Xentar - So 07.03.10 18:57

Hast du schonmal nach IdHTTP Post gesucht? Da finden sich schon einige Diskussionen zu dem Thema..


K.S.M. - So 07.03.10 19:41

Ich hab jetzt was gefunden. Und zwar mit einem "TIdMultiPartFormDataStream". Zwar muss man dafür erst die Datei abspeichern aber es scheint zu funktionieren. Noch sauberer wäre es ja schon, wenn man nicht erst die datei abspeichern müsste...


Xentar - So 07.03.10 19:49

Tja.. Code?


K.S.M. - So 07.03.10 20:02

So es ist jetzt abgeschlossen. Jetzt muss nicht einmal vorher abgespiehcert werden :)

Hier mein Code:

DELPHI

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure SaveToServer( const aReservator { Die PHP-Datei die entgegennimmt }, aURL: String { Wohin die Datei verschoben werden soll } );
var
  http: TidHttp;
  ms: TMemoryStream;
  mfd: TIdMultiPartFormDataStream;
begin
  http := TIdHTTP.Create( nil );
  try
    mfd := TIdMultiPartFormDataStream.Create;
    try
      ms := TMemoryStream.Create;
      try
        // Hier wird mein Stream gefüllt.
        SaveToStream( ms );
        // Der MIME-Typ wurde von mir erfunden.
        mfd.AddObject('Upload''xeonlab/timetabeling-filecontainer', ms, 'upload.xtf' );
        mfd.AddFormField( 'Destination', aURL );
        // Hier wird gepostet
        ShowMessage( http.Post( aReservator, mfd ) );
      finally
        ms.Free;
      end;
    finally
      mfd.Free;
    end;
  finally
    http.Free;
  end;
end;


PHP

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
<?PHP
    
  if ( isset($_FILES["Upload"]) && isset($_POST["Destination"]) ) {
    move_uploaded_file( $_FILES["Upload"]['tmp_name'], $_POST["Destination"] );
    echo 'Upload von "'. $_POST["Destination"] .'" ('.$_FILES["Upload"]["type"].') erfolgreich.';
  }

?>


Ich hoffe es hilft noch jemandem ;)
Liebe Grüße,
K.S.M.


Xentar - So 07.03.10 20:22

user profile iconK.S.M. hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt wird nicht mal mehr

Hier fehlt die hälfte von nem Satz..

Zu deinem Code: Schau dir mal bitte an, wie man einen MemoryStream bedient..

Delphi-Quelltext
1:
Write(ms);                    

Und WAS da rein geschrieben werden soll, errät Delphi, oder wie?


K.S.M. - So 07.03.10 20:34

Nein, sry, ich hab nicht den vollständigen Code eingestellt. Das ist nämlich eigentlich eine Prozedur eines Objektes. Das besitzt die Funktion "Write( aStream: TStream );" und in der wird dann der Stream gefüllt. Ich mache den Quelltext mal verständlicher.