Entwickler-Ecke

Internet / Netzwerk - Datei-Upload via http


blo - Sa 11.11.06 03:17
Titel: Datei-Upload via http
Hallo!
Ich möchte folgendes Problem lösen: Eine lokale Datei auf einen Webserver hochladen.
Testumgebung: D5 Prof, Indy 9.0.14, xampplight mit php 5.14.
Per FTP klappt das alles. Aber manchmal muss ich auf das Http-Protokoll ausweichen.
Habe versucht mich im Forum schlau zu machen, und verwende mittlerweile folgenden Delphi-Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  Data: TIDMultiPartFormDataStream;
begin
  Data := TIdMultiPartFormDataStream.Create;
  try
    Data.AddFile('archive''c:\temp\abc.zip''application/zip');
    IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
    Data.Position := 0;
    Memo1.Lines.Text := IdHTTP1.Post('http://localhost/upload.php', Data);
  finally
    Data.Free;
  end;
end;


Das zugeörige PHP-Script lautet:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?php
// In PHP earlier then 4.1.0, $HTTP_POST_FILES should be used instead of
// $_FILES.  In PHP earlier then 4.0.3, use copy() and is_uploaded_file()
// instead of move_uploaded_file

$uploaddir = 'tausch/';
$uploadfile = $uploaddir. $_FILES['archive']['name'];

print "<pre>";
if (move_uploaded_file($_FILES['archive']['name'], $uploadfile)) {
    print "File is valid, and was successfully uploaded. ";
    print "Here's some more debugging info:\n";
    print_r($_FILES);
}
 else {
    print "Possible file upload attack!  Here's some debugging info:\n";
    print_r($uploadfile);
}

?>


Wenn ich das Delphiprog. starte gibt das Php-Script zurück:

Delphi-Quelltext
1:
2:
<pre>Possible file upload attack!  Here's some debugging info:
tausch/

Mit anderen Worten, die Datei wurde nicht auf den Server gespeichert.
Kann mir jemand helfen, damit die Datei auf den Server gespeichert wird?


blaueled - Sa 11.11.06 11:17

Hallo,

hast du den savemode eingeschaltet ?
setz die berechtigungen mal auf 777

Arne


blo - Sa 11.11.06 12:05

Hallo Arne,
was meinst Du mit "savemode"?
Soweit ich das Problem mit meinem Programm verstehe (siehe Rückmeldung des Php-Scripts), erhält das Script erst gar nicht den File-Namen der Datei die gespeichert werden soll.
Ich finde nirgendwo eine Doku. die das erklärt (weder in "Indy in depth" oder sonstwo). Für das Ftp-Protokoll ist alles gut erklärt. Aber wer kennt ein gutes Beispiel für das Zusammenspiel Delphi <-> Php bzgl. Dateidown- bzw Upload? Könnte ich gut gebrauchen.


jaenicke - Sa 11.11.06 12:48

Du nimmst ['name'], das ist aber doch der Dateiname auf dem Client-PC!! Und der existiert auf dem Server logischerweise nicht so ohne Pfadangabe...
Du musst ['tmp_name'] nehmen! DAS ist der Name und Pfad der temporären Datei (ich meine jetzt in Zeile 10 natürlich)!


blo - Sa 11.11.06 13:27

Sorry, du hast natürlich recht! Habe ich entsprechend wieder geändert, aber leider kommt immer die Nachricht:
<pre>Possible file upload attack! Here's some debugging info:
tausch/


mkinzler - Sa 11.11.06 13:32

Schau dir mal die php.ini an. Welcher Pfad ist für die Uploads eingetragen? hat der Benutzer darauf Rechte?


blo - Sa 11.11.06 13:47

Es handelt sich um einen lokalen Web-Server (xampplite), da sollte es doch keine Rechtprobleme geben, oder? Eingetragen ist in Php.Ini: upload_tmp_dir = "\xampplite\tmp"
Liegt nicht vielmehr das Problem in der Parameterübergabe? Selbst wenn der Befehl move_uploaded_file fehlschlägt, so sollte doch im else-Bereich der Name der Datei zurückgegeben werden?


mkinzler - Sa 11.11.06 13:50

Versuche mal upload_tmp_dir = "<LW>:\xampplite\tmp"


blo - Sa 11.11.06 14:02

Hab ich gemacht - leider keine Veränderung


blo - Mo 13.11.06 23:00

Habe zwischenzeitlich den Fehler gefunden: Nachdem ich Indy auf 9.0.18 umgestellt habe und das neueste Xampp installiert habe, klappte alles.
Danke für die Unterstützung.