Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP]ftp_get will nicht so wie ich es will (https://www.delphipraxis.net/56321-%5Bphp%5Dftp_get-will-nicht-so-wie-ich-es-will.html)

DGL-luke 3. Nov 2005 23:04

Re: [PHP]ftp_get will nicht so wie ich es will
 
Code:
function ftp_passthru($ftphandle,$filename,$tmppath) {
ftp_get($ftphandle,$tmppath.'/'.basename($filename),$filename,octdec("777"));
header(Content-Type: application/x-download);
readfile($tmppath.'/'.basename($filename));
unlink($tmppath.'/'.basename($filename));
}
sollte "prinizipiell" funktionieren. evtl. macht das basename probleme.

jetzt muss ich aber ganz schnell off, cu.

Kontodaten kommen dann per PM. ;)

Luckie 3. Nov 2005 23:27

Re: [PHP]ftp_get will nicht so wie ich es will
 
Ich habe jetzt folgendes gefunden:
Code:
<?php
  $tp = tmpfile ();
  // get file as the tempfile created
  $result = @ftp_fget ( $fp, $tp, $newpath.'/'.$downloadfile, FTP_BINARY);

  // if the server sucessfully got the file
  if ( $result )
  {
    header( "Content-Disposition: inline; filename=$newpath.'/'.$downloadfile\n\n");
    header ( "Content-type: applicatation/download; name=\"$newpath.'/'.$downloadfile\"\n\n" );
    rewind ( $tp );
    fpassthru ( $tp );
    die ();
  }
?>
Dies sollte eigentlich den Datei-Download-Dialog öffnen. Tut es aber leider nicht. das
Code:
$newpath.'/'.$downloadfile
ergibt zum Beispiel: /html/Ablage/02 Gipsy.jpg, sollte also stimmen. Ausgegeben wird aber nur eine leere Seite mit diesem Quelltext:
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>

ripper8472 4. Nov 2005 00:10

Re: [PHP]ftp_get will nicht so wie ich es will
 
fseek($tp, 0, SEEK_SET); vor dem passthruen

Luckie 4. Nov 2005 00:13

Re: [PHP]ftp_get will nicht so wie ich es will
 
Code:
<?php
  $tp = tmpfile ();
  // get file as the tempfile created
  $result = @ftp_fget ( $fp, $tp, $newpath.'/'.$downloadfile, FTP_BINARY);

  // if the server sucessfully got the file
  if ( $result )
  {
    header( "Content-Disposition: inline; filename=$newpath.'/'.$downloadfile\n\n");
    header ( "Content-type: applicatation/download; name=\"$newpath.'/'.$downloadfile\"\n\n" );
    rewind ( $tp );
    fseek($tp, 0, SEEK_SET);
    fpassthru ( $tp );
    die ();
  }
?>
Änderert leider nichts an der Ausgabe.
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>

ripper8472 4. Nov 2005 00:25

Re: [PHP]ftp_get will nicht so wie ich es will
 
kann es sein, dass dieses tmpfile() nicht fuer lesezugriff geoeffnet ist?
probier mal selber eins anzulegen (tempnam).

ist $result wirklich === true? var_dump($result) vor dem if waere aufschlussreich

Luckie 4. Nov 2005 00:33

Re: [PHP]ftp_get will nicht so wie ich es will
 
Zitat:

tmpfile
Erstellt eine temporäre Datei mit einem eindeutigen Dateinamen im Schreibmodus und gibt einen Dateizeiger ähnlich wie es bei der Funktion fopen() erfolgt, zurück. Die Datei wird automatisch gelöscht, wenn sie geschlossen wird (mit fclose()), oder das Skript beendet wird.
Also rein schreiben sollte gehen.

Hm, $result ist NULL. Und jetzt?

ripper8472 4. Nov 2005 00:39

Re: [PHP]ftp_get will nicht so wie ich es will
 
wenn result null ist, dann ist schon da oben der fehler. kontrolliere bitte alle parameter.
$result sollte eigentlich nur true oder false sein, niemals NULL... wundert mich. dich nicht?

dieses tmpfile muss auch lesezugriff haben, sonst is asche mit fpassthru.

Luckie 4. Nov 2005 01:15

Re: [PHP]ftp_get will nicht so wie ich es will
 
Ich habe vergessen vorher eine Verbindung zu dem FTP-Server aufzubauen. :oops:

Flocke 4. Nov 2005 07:58

Re: [PHP]ftp_get will nicht so wie ich es will
 
Zitat:

Zitat von Luckie
Das wollte mir auch alle bei ftp_put erklären und haben gesagt, das Script hätte keinen Zugriff auf meinem lokalen Rechner, um die Datei hochzuladen, letzt endlich ging es aber doch. Also muss es auch andersrum gehen. Ich habe nur noch nicht rausgefunden, was ich anders bzw. falsch mache.

Außerdem steht da ja:
Zitat:

Liest eine Datei von einem FTP-Server und speichert sie lokal (download)
Und lokal bedeutet für mich: 'hier bei mir und nicht auf dem Sever, wo das Script läuft'. Desweiteren habe ich schon Scripte gesehen und ausprobiert, die das auch konnten. Nur leider kann ich nicht nachvollziehen, was die anders machen als ich.

Also hört auf mir zu erzählen, dass das nicht ginge.

Wenn dir alle etwas anders erzählen, solltest du vielleicht mal anfangen nachzudenken...

Zitat:

Zitat von Luckie
OK, gegenbeweis, hier mein Upload-Code:
Code:
    function upload_file($dest, $source, $mode)
    {
      $conn = ftp_connect(SERVER);
      ftp_login($conn, USER, PW);
      $result = ftp_put($conn, $dest, $source, $mode);
      ftp_close($conn);
      return $result;
    }
Code:
echo '<h3>Upload file&lt;/h3&gt;';
          echo '&lt;p&gt;';
          if ($_FILES['uploadfile']['size'] &lt; $MAX_FILE_SIZE)
          {
            if (!@upload_file('/'.$newpath.'/'.$_FILES['uploadfile']['name'], $uploadfile, FTP_BINARY))
            {
              echo 'Error!'.'&lt;br&gt;';
              echo 'File &lt;i&gt;'.$_FILES['uploadfile']['name'].'&lt;/i&gt; could not be saved in &lt;i&gt;'.$newpath.'&lt;/i&gt;';
              echo $_FILES['uploadfile']['error'];
            }
            else
            {
              echo 'File &lt;i&gt;'.$_FILES['uploadfile']['name'].'&lt;/i&gt; successfully saved in &lt;i&gt;'.$newpath.'&lt;/i&gt;&lt;br&gt;';
            }
            }
            else
            {
              echo 'The filesize of '.$_FILES['uploadfile']['name'].' ('.format_filesize($_FILES['uploadfile']['size']).') exceeds the allowed filesize of '.format_filesize(MAX_FILE_SIZE);
            }
Nichts mit move_uploaded_file . ;)

Und es soll ein WebFTP Client für mich werden und es gibt Verzeichnisse außerhalb des Documentroot-Folders, an die ich mit dem Browser nicht drankomme, aber mit einem FTP-Client. Und an die möchte ich natürlich auch mit meinem WebFTP Client drankommen.

Desweiteren bedeutet bei ftp_put lokal auch wirklich lokal:
Zitat:

int ftp_put ( int ftp_stream, string remote_file, string local_file, int mode )
Und es sind ja explizit FTP-Funktionen, also es ist das FTP Protokoll, was dazu geschaffen wurde Dateien zwischen Rechnern auszutauschen.

Sicher geht das, du lädst ja etwas von deinem Server (dem FTP-Client) auf deinen Server (dem FTP-Server). Wenn in der PHP-Dokumentation "lokal" steht, dann meinen die den Rechner, auf dem PHP ausgeführt wird.

Jetzt noch einmal ausführlich von Jemandem, der seit ~3 Jahren richtig große Web-Applikationen mit PHP schreibt (> 50.000 Zeilen):

Wenn du einen Form-Based-File-Upload machst, also
Code:
<form method="post" action="meinscript.php">
<input type="file" ...>
</form>
und man damit eine Datei auswählt und das Formular abschickt, dann wird der Inhalt der Datei zusammen mit der Anfrage an deinen Webserver geschickt. Die Datei ist also schon auf dem Server wenn dein Skript ausgeführt wird.

Die Funktion move_uploaded_file dient nur dazu, die dafür angelegte temporäre Datei an die endgültige Position zu verschieben. Darum bekommt diese Funktion als Parameter auch die Namen von zwei Dateien auf deinem Server und nicht den ersten von deinem lokalen Rechner.

Wenn es anders nicht ginge, meinst du nicht dann gäbe es schon 1.000 Skripte für das, was du zu implementieren versuchst?

Ich muss jetzt los - wenn du es immer noch nicht glaubst, dann schreibe ich dir nachher ein kleines Skript...

@ripper8472: Bestärke ihn doch nicht noch in seinem Irrglauben, es ginge nur über eine FTP-Verbindung.

DGL-luke 4. Nov 2005 09:24

Re: [PHP]ftp_get will nicht so wie ich es will
 
@FLocke: Ja, ich habe ihm das auch schon ein paar mal gesagt. Ich glaube, er glaubts mir inzwischen. ;) Im übrigen sind da doch ien paar nicht ganz saubere Sachen in deinem Post...

Code:
<?php
  $tp = tmpfile ();
  // get file as the tempfile created
  $result = @ftp_fget ( $fp, $tp, $newpath.'/'.$downloadfile, FTP_BINARY);

  // if the server sucessfully got the file
  if ( $result )
  {
    header ( "Content-Disposition: inline; filename=$downloadfile\n\n"); //der pfad ist ja wohl irrelevant
    header ( "Content-type: application/x-download" ); //fipptehler, ausserdem mal das filename zeuchs weggelassen. braucht man doch nicht zweimal.
    rewind ( $tp ); //nach rewind braucht man kein seek mehr
    fpassthru ( $tp );
    flush(); //flush ist sauberer als die.
  }
?>
Hab hier ein paar Fehler ausgebessert. sollte so gehen, wenn du zuvor die FTP-Verbindung aufbaust und die Variablen setzt.

Wie aus diesem Script die unten angegebenen Metas rauskommen sollen, ist mir aber schleierhaft.

Ansonsten könntest du ja auch das von mir mal ausprobieren. Ich bin zwar kein Pro wie Flocke, aber trotzdem...


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.
Seite 2 von 3     12 3      

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