Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Datei Upload via Http.Post (https://www.delphipraxis.net/80565-datei-upload-via-http-post.html)

Blo 11. Nov 2006 00:37


Datei Upload via Http.Post
 
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:
Code:
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:
Code:
<?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']['tmp_name'];

print "<pre>";
if (move_uploaded_file($_FILES['archive']['tmp_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:
Code:
<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?

marabu 11. Nov 2006 12:25

Re: Datei Upload via Http.Post
 
Hi,

das erste Argument der Funktion move_uploaded_file() sollte besser $_FILES['archive']['tmp_name'] sein.

Grüße vom marabu

Blo 11. Nov 2006 12:44

Re: Datei Upload via Http.Post
 
Danke für den Tip! Hab ich geändert - keine Veränderung.

marabu 11. Nov 2006 13:06

Re: Datei Upload via Http.Post
 
Schau dir noch deine Variable uploadfile an - dort ist der gleiche Fehler: Muss ['name'] sein statt ['tmp_name'].

Blo 11. Nov 2006 13:44

Re: Datei Upload via Http.Post
 
Habe ich geändert - keine Veränderung!

marabu 11. Nov 2006 13:47

Re: Datei Upload via Http.Post
 
Keine Veränderung?

Wird immer noch ein leerer Namensteil in der Meldung ausgegeben?

Blo 11. Nov 2006 14:05

Re: Datei Upload via Http.Post
 
Ja, es wird immer noch
Zitat:

<pre>Possible file upload attack! Here's some debugging info:
tausch/
ausgegeben.

marabu 11. Nov 2006 16:50

Re: Datei Upload via Http.Post
 
Ich habe dein Problem mit meinen Änderungen auf meinem Rechner nachgestellt - und es funktioniert. Allerdings gebe ich einen absoluten Verzeichnisnamen an und nicht "tausch/". Vielleicht ist ja das dein Fehler.

Grüße

Blo 11. Nov 2006 18:23

Re: Datei Upload via Http.Post
 
Habe einen absoluten Pfad gesetzt:
Delphi-Quellcode:
<?php
$uploaddir = 'c:\xampplite\htdocs\tausch\';
$uploadfile = $uploaddir. $_FILES['archive']['tmp_name'];
print "<pre>";
if (move_uploaded_file($_FILES['archive']['tmp_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);
}
?>
Jetzt kommt ein Parser-Error:
Delphi-Quellcode:



[b]Parse error[/b]: parse error, unexpected T_STRING in [b]C:\xampplite\htdocs\upload.php[/b] on line [b]3[/b]
:wall:
Würdest Du bitte dein PHP-Script und die Delphi-Routine einmal posten?

Danke für die Mühe!

marabu 11. Nov 2006 19:47

Re: Datei Upload via Http.Post
 
Kipp mal die Schrägstriche in uploaddir in die entgegengesetzte Richtung und achte endlich auf die richtigen Namen - dann sehen wir weiter.

Code:
$uploaddir = 'c:/xampplite/htdocs/tausch/';
$uploadfile = $uploaddir. $_FILES['archive']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['archive']['tmp_name'], $uploadfile)) { 
...
Grüße

Blo 11. Nov 2006 20:02

Re: Datei Upload via Http.Post
 
Habe ich geändert - Ergebnis:
Code:
<pre>Possible file upload attack!  Here's some debugging info:
c:/xampplite/htdocs/tausch/

mkinzler 11. Nov 2006 20:05

Re: Datei Upload via Http.Post
 
Poste mal deine php.ini

ErazerZ 11. Nov 2006 20:12

Re: Datei Upload via Http.Post
 
Nur mal nebenbei du könntest auch Prüfen ob die Datei eine PHP Datei oder sonst eine Ausführbare Datei ist denn es kann dann auf deinen Server ausgeführt werden, falls du verstehst was ich meine ;).

marabu 11. Nov 2006 20:12

Re: Datei Upload via Http.Post
 
Du hast anscheinend keine Datei hochgeladen. Die Meldung kommt ja weil move_uploaded_file() scheitert und das kann bei fehlendem Dateinamen daran liegen, dass die von deinem Programm per AddFile() hinzugefügte Datei nicht gefunden wird. Bau mal eine Prüfung in dein Delphi-Programm ein:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn: TFileName;
  Data: TIDMultiPartFormDataStream;
begin
  Data := TIdMultiPartFormDataStream.Create;
  try
    fn := 'c:\temp\abc.zip';
    if FileExists(fn) then
    begin
      Data.AddFile('archive', fn, 'application/zip')
      IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
    end else ShowMessage(Format('file "%s" not found', [fn]));
//...
Grüße

Blo 11. Nov 2006 20:34

Re: Datei Upload via Http.Post
 
Habe ich eingebaut: Datei existiert, Programm verzweigt also in den "then"-Teil und in Memo1.Lines steht wieder was ich zuletzt gepostet habe. Offensichtlich steht doch nichts in $_FILES, oder sehe ich das falsch?

mkinzler 11. Nov 2006 20:35

Re: Datei Upload via Http.Post
 
Wie gesagt, zeige mal deine ini.

Blo 11. Nov 2006 20:39

Re: Datei Upload via Http.Post
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jemand hat nach meiner php.ini gefragt. Hier ist sie. Übrigens ist der zend-optimizer aktiviert.

mkinzler 11. Nov 2006 20:48

Re: Datei Upload via Http.Post
 
füge mal
Code:
echo $_FILES['archive']['tmp_name'];
ein.

ErazerZ 11. Nov 2006 20:48

Re: Datei Upload via Http.Post
 
Ich würde sie an deiner stelle lieber Anhängen, 1288 Zeilen sind schon ne menge.

Blo 11. Nov 2006 21:01

Re: Datei Upload via Http.Post
 
Habe ich gemacht:
Code:
<?php
$uploaddir = 'c:/xampplite/htdocs/tausch/';
$uploadfile = $uploaddir. $_FILES['archive']['name'];
echo $_FILES['archive']['tmp_name'];
print "<pre>";
if (move_uploaded_file($_FILES['archive']['tmp_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);
}
?>
Ich sehe keine Auswirkung des echo-Befehls. Aber der print_r($uploadfile) zeigt ja, dass $uploadfile nur den Inhalt aus $uploaddir besteht.

mkinzler 11. Nov 2006 21:07

Re: Datei Upload via Http.Post
 
Zitat:

Aber der print_r($uploadfile) zeigt ja, dass $uploadfile nur den Inhalt aus $uploaddir besteht.
Dann scheint deine Vermutung das $_FILES leer ist zu stimmen.

laß dir mal dessen Inhalt anzeigen

Code:
echo implode(",", $_FILES);

Blo 11. Nov 2006 21:20

Re: Datei Upload via Http.Post
 
Wie muss ich das in upload.htm einbauen?
So?
Code:
<?php
print_r (implode(",", $_FILES));
?>

mkinzler 11. Nov 2006 21:22

Re: Datei Upload via Http.Post
 
Am Besten gleich an den Anfang.

Blo 11. Nov 2006 21:27

Re: Datei Upload via Http.Post
 
Hab ich an den Anfang gesetzt: Es wird nichts angezeigt!

mkinzler 11. Nov 2006 21:29

Re: Datei Upload via Http.Post
 
Dann ist es gewiss. Die variable ist leer. Aktiviere mal zum Test die Globals und lasse dir dann $archive_file anzeigen.

Blo 11. Nov 2006 21:37

Re: Datei Upload via Http.Post
 
Kenn mich mit Php nicht so gut aus:
Zitat:

Dann ist es gewiss. Die variable ist leer. Aktiviere mal zum Test die Globals und lasse dir dann $archive_file anzeigen.
Habe in Php.ini folgendes geändert:
Code:
register_globals = On
und in upload.php folgendes eingetragen:
Code:
<?php
print_r ($archive_file);
?>
Es wird nichts ausgegeben!

mkinzler 11. Nov 2006 21:41

Re: Datei Upload via Http.Post
 
Versuch mal
$archive

Blo 11. Nov 2006 21:53

Re: Datei Upload via Http.Post
 
Tut sich nichts!

mkinzler 11. Nov 2006 21:56

Re: Datei Upload via Http.Post
 
Teste das PHP-Skript mal mit einem HTML-Formular.

Blo 12. Nov 2006 00:48

Re: Datei Upload via Http.Post
 
Habe ich gemacht - im Ergebnis kein Unterschied.
Danach auf einen anderen Webserver ausprobiert: Ebenso kein Erfolg.
So langsam bin ich es leid - macht einfach keinen Spass! :gruebel:

marabu 12. Nov 2006 11:45

Re: Datei Upload via Http.Post
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Blo
... Würdest Du bitte dein PHP-Script und die Delphi-Routine einmal posten? ...

Hier mein Test-Projekt und das PHP-Script. D7 - INDY9 - PHP5.

Schönes Wochenende für alle

Blo 12. Nov 2006 14:32

Re: Datei Upload via Http.Post
 
Möchte Bericht erstatten:
Nachdem ich deine Demo heruntergeladen habe klappte der Download immer noch nicht.
Habe daraufhin Indy 9.0.14 deinstalliert und die letzte Version aus der 9er Serie installiert: 9.0.18
Ebenso Xampplite deinstalliert und die neueste Xampp-Version installliert.

Und siehe da: Alles klappt! :spin2:

Also: Dickes Lob für die Unterstützung!

Der Update klappt jetzt also.
Wenn ich jetzt eine Datei per Http downloaden will, muss diese Anfrage dann auch an ein Php-Script gerichtet werden?
Wenn ja, durch welchen Befehl muss "move_uploaded_file" ersetzt werden?

Wie war das mit den kleinen Finger ?!

Gruss

mkinzler 12. Nov 2006 14:45

Re: Datei Upload via Http.Post
 
Zitat:

Wenn ich jetzt eine Datei per Http downloaden will, muss diese Anfrage dann auch an ein Php-Script gerichtet werden?
Nein, kann direkt geladen werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.

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