![]() |
[PHP]ftp_get will nicht so wie ich es will
Ich versuche mit
![]() Implementiert ist das so:
Code:
case '7':
echo '<h3>Download file</h3>'; echo ' '; $path_parts = pathinfo($downloadfile); $filename = $path_parts["basename"]; $destfile = $localdir.'\\'.$filename; $sourcefile = $newpath.'/'.$downloadfile; if (!@download_file($destfile , $sourcefile, FTP_BINARY)) { echo 'Error! '; echo 'File [i]'.$sourcefile.'[/i] could not be save in [i]'.$destfile.'[/i]'; } else { echo 'File [i]'.$sourcefile.'[/i] successfully downloaded in [i]'.$destfile.'[/i]'; } echo '</p>'; break;
Code:
In $destfile steht dann so was drinne: d:\foobar.txt und in $sourcefile steht auch was gescheites drinne. Nur ladet die Datei nicht auf meiner loaklen Festplatte, sondern wieder auf dem Server in dem Verzeichnis, wo das Script ausgeführt wird unter dem Dateinamen, der in $destfile angegeben ist, also d:\foobar.txt heißt die datei dann. :(
function download_file($dest, $source, $mode)
{ $conn = ftp_connect(SERVER); ftp_login($conn, USER, PW); $result = ftp_get($conn, $dest, $source, $mode); ftp_close($conn); return $result; } Aber wenn das Hochladen vom lokalen Rechner geht, dann muss doch auch das Runterladen gehen. :gruebel: |
Re: [PHP]ftp_get will nicht so wie ich es will
die datei muss schon geoeffnet sein. so stehts aber auch in der doku... es wird ein filehandle verlangt.
|
Re: [PHP]ftp_get will nicht so wie ich es will
Sorry falsche Funktion verlinkt. das, was du sagst trifft auf ftp_fget zu, ich benutze aber ftp_get.
|
Re: [PHP]ftp_get will nicht so wie ich es will
es ist klar, dass die datei auf dem server gespeichert wird, auf dem auch php laeuft.
runterladen geht ueber den browser, also musst du die datei im php script ausgeben. |
Re: [PHP]ftp_get will nicht so wie ich es will
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:
Also hört auf mir zu erzählen, dass das nicht ginge. |
Re: [PHP]ftp_get will nicht so wie ich es will
ähm...
Luckie, ich will ja nicht rechthaberisch wirken, aber für ein PHP-Skript ist "lokal" der Server, auf dem es läuft. Der User kriegt nur, was der Browser kriegt, und der Browser kriegt nur, was du ihm per header, echo, print oder sonstigem zukommen lässt. stell dir mal vor, ich bau mir ein php-skript, und bei jedem, der es ausführt landet einfach so "1337_virus.exe" im verzeichnis D:\ :shock: :mrgreen: Du musst ein wenig anders an die Sache rangehen ;) downloaden geht nur mit
Code:
und anschließendem durchspulen des codes. ausser du verweist den browser auf eine tatsächlich existierende datei auf dem server.
header("Content-Type: application/octet-stream");
Das hier: Zitat:
bitte nicht falsch verstehen, aber es macht Spaß zu sehen, dass auch Mods nicht allwissend sind ;) Im übrigen sehe ich keinen Sinn darin, etwas per FTP zu holen und dann dem user zu geben - verlinke da besser direkt auf eine Datei, hol sie direkt vom Filesystem des Servers, wenn es der gleiche ist, oder verweise den Browser auf die Datei. |
Re: [PHP]ftp_get will nicht so wie ich es will
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:
Nichts mit move_uploaded_file . ;)
echo '<h3>Upload file</h3>';
echo ' '; if ($_FILES['uploadfile']['size'] < $MAX_FILE_SIZE) { if (!@upload_file('/'.$newpath.'/'.$_FILES['uploadfile']['name'], $uploadfile, FTP_BINARY)) { echo 'Error!'.' '; echo 'File [i]'.$_FILES['uploadfile']['name'].'[/i] could not be saved in [i]'.$newpath.'[/i]'; echo $_FILES['uploadfile']['error']; } else { echo 'File [i]'.$_FILES['uploadfile']['name'].'[/i] successfully saved in [i]'.$newpath.'[/i] '; } } else { echo 'The filesize of '.$_FILES['uploadfile']['name'].' ('.format_filesize($_FILES['uploadfile']['size']).') exceeds the allowed filesize of '.format_filesize(MAX_FILE_SIZE); } 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 ![]() Zitat:
|
Re: [PHP]ftp_get will nicht so wie ich es will
definition: lokal heisst auf sem server.
uploads und downloads laufen NUR ueber den browser. upload: auswahl der datei im browser. browser sendet datei an script. script speichert datei in einem /tmp verzeichnis. im script verschiebt eine funktion diese tmpdatei an den entgueltigen ort. download: (hier wuerde dein ftp kram an die reihe kommen: datei vom ftp laden und aufm webserver speichern) script liest datei (auf dem server) und gibt diese daten an den browser aus. browser entscheidet, ob zum download anbieten oder anzeigen. ich hab das alles schon mal gemacht und bin mir sicher, dass es nur so ablaeuft. offtopic: luckie, ich hoffe du erinnerst dich an diesen thread, wenn ein anfaenger mal wieder deine nerven strapaziert. du machst es uns (mir jedenfalls) nicht leichter, indem du manche dinge einfach als gegeben ansiehst oder "lokal bin ich, nicht der server" sagst. |
Re: [PHP]ftp_get will nicht so wie ich es will
Ok, Luckie, das move_uploaded_file fehlt nur, weil dus eben per FTP gleich hochlädst. Was bei einem WebFTP ja auch sinnvoll ist. Du greifst aber trotzdem auf $_FILES zu, das heisst, die Datei kommt vom Browser per POST-Anfrage in das temp-verzeichnis des webservers, das PHP-Script kriegt per $_FILES den pfad, und lädt das ganze dann auf einen FTP-Server hoch. es existiert zwischen Browser und Server also keine vom PHP-Skript "ausgelöste" FTP-Verbindung. Quod erat demonstrandum. ;)
Dass du beim WebFTP auch beim Download wieder die zwischenstation über den Webserver gehen musst, ist dann natürlich klar. also Vom FTP-Server zum Skript und von da zum browser. am besten per ftp_get, das stimmt. und von da aus dann per readfile, die spult dir eine komplette datei an den browser durch. Eventuell musst du vorher noch die header senden. ftp_get sollte dir ja direkt die datei im dateisystem des Webservers anlegen, diese kannt du dann durchspulen. wenn du einen Datezeiger hast, kannst du auch fpassthru nehmen. und danach das löschen der temporären datei nicht vergessen. ;) |
Re: [PHP]ftp_get will nicht so wie ich es will
Zitat:
|
Re: [PHP]ftp_get will nicht so wie ich es will
Code:
sollte "prinizipiell" funktionieren. evtl. macht das basename probleme.
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)); } jetzt muss ich aber ganz schnell off, cu. Kontodaten kommen dann per PM. ;) |
Re: [PHP]ftp_get will nicht so wie ich es will
Ich habe jetzt folgendes gefunden:
Code:
Dies sollte eigentlich den Datei-Download-Dialog öffnen. Tut es aber leider nicht. das
<?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 (); } ?>
Code:
ergibt zum Beispiel: /html/Ablage/02 Gipsy.jpg, sollte also stimmen. Ausgegeben wird aber nur eine leere Seite mit diesem Quelltext:
$newpath.'/'.$downloadfile
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> |
Re: [PHP]ftp_get will nicht so wie ich es will
fseek($tp, 0, SEEK_SET); vor dem passthruen
|
Re: [PHP]ftp_get will nicht so wie ich es will
Code:
Änderert leider nichts an der Ausgabe.
<?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 (); } ?>
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> |
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 |
Re: [PHP]ftp_get will nicht so wie ich es will
Zitat:
Hm, $result ist NULL. Und jetzt? |
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. |
Re: [PHP]ftp_get will nicht so wie ich es will
Ich habe vergessen vorher eine Verbindung zu dem FTP-Server aufzubauen. :oops:
|
Re: [PHP]ftp_get will nicht so wie ich es will
Zitat:
Zitat:
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:
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.
<form method="post" action="meinscript.php">
<input type="file" ...> </form> 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. |
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:
Hab hier ein paar Fehler ausgebessert. sollte so gehen, wenn du zuvor die FTP-Verbindung aufbaust und die Variablen setzt.
<?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. } ?> 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... |
Re: [PHP]ftp_get will nicht so wie ich es will
Es hat mal wieder nicht jeder das Kleingedruckte gelesen. ;) Ich habe doch oben geschrieben, dass ich vergessen hatte eine Verbindung aufzubauen.
|
Re: [PHP]ftp_get will nicht so wie ich es will
ich dachte, du hättest danach geschrieben, es ginge doch nicht? tippfehler waren auf jeden fall drin....
oder bin ich (not(nicht jeder)) ? ;) |
Re: [PHP]ftp_get will nicht so wie ich es will
Du hast es nicht anders gewollt ... :mrgreen: :???:
Dieser Code läuft eigentlich so fast auf jedem Webserver mit PHP und lädt eine Datei in das Skriptverzeichnis hoch (sofern dieses unterhalb von DOCUMENT_ROOT liegt, ansonsten müsste man einen Spezialfall behandeln).
Code:
... und die bist sicher, dass move_uploaded_file bei dir nicht funktioniert?
<html>
<head> <title>File based form upload test</title> </head> <body> <?php if (count($_FILES)) { echo "<h1>Result</h1>\n"; echo "<pre>\$_FILES = " . htmlspecialchars(print_r($_FILES, true)) . "</pre>\n"; if (!empty($_POST['versch'])) { $rp = dirname($_SERVER['PHP_SELF']) . '/'; foreach ($_FILES as $file) if (!empty($file['name'])) { $target = str_replace('//', '/', $_SERVER['DOCUMENT_ROOT'] . $rp . basename($file['name'])); $tht = htmlspecialchars($target); if (file_exists($target)) { echo " File `" . $tht . "´ already exists.</p>\n"; if (unlink($target)) echo " Old file `" . $tht . "´ removed.</p>\n"; else echo " Couldn't remove old file `" . $tht . "´.</p>\n"; } if (move_uploaded_file($file['tmp_name'], $target)) echo " Uploaded file was stored as `<a href=\"" . str_replace('//', '/', basename($tht)) . "\">" . $tht . "</a>´.</p>\n"; else echo " Uploaded file `" . htmlspecialchars($file['tmp_name']) . "´ could not be moved to `" . $tht . "´.</p>\n"; } } ?> <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="get"> <input type="submit" value=" Noch einmal "> </form> </div> <?php //phpInfo(); } else { ?> <h1>Upload</h1> <div> <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post" enctype="multipart/form-data"> Filename: <input type="file" name="datei" size="50"> <input type="checkbox" name="versch">Try `move_uploaded_file´ <input type="submit" value=" Absenden "> </form> </div> <?php } ?> </body> |
Re: [PHP]ftp_get will nicht so wie ich es will
Zitat:
|
Re: [PHP]ftp_get will nicht so wie ich es will
Ich bezog das noch auf den Grund, warum er in dem anderen Thread überhaupt mit FTP anfing - nämlich weil er move_uploaded_file nicht zum funktionieren gebracht hat.
Du meinst also er macht einen "Web-basierten FTP-Client", so wie ![]() // Nachtrag: ![]() |
Re: [PHP]ftp_get will nicht so wie ich es will
ja, meine ich....
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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