Hallo Froumsgemeinde,
zunächst einmal ein freundliches
Bin relativer Neuling in PHP und bräuchte einmal eure hilfe:
Ich habe ein PHP script zum upload von Dateien auf einen FTP-Server inkl. Progressbar in einer Mischung mit ein wenig JavaScript.
Das funktioniert soweit auch hervorragend.
Im Prinzip besteht das Script aus zwei Teilen:
1. Das gängige HTML Formular:
Nach dem Abschicken öffnet sich hier ein neues Fenster in dem mein PHP script hochladen2.php ausgeführt wird.
2. Der zweite Teil ist das eigentliche Script (relativ dirty):
Das ganze funktioniert im grunde einwandfrei.
Im groben und ganzen passiert hier folgendes:
Nachdem mit dem Server verbunden wurde, übertrage ich die Datei mittels: ftp_nb_fput da diese dann nicht gesperrt ist.
Im folgenden öffne ich dann eine zweite Verbindung bei der dann die Dateigröße auf dem Server abgefragt wird.
Dann wird noch prozentual die größe berechnet und per javascript der ganze krempel ausgegeben.
Die progressbar ist ein einfaches gif, dass per javascript einfach resized wird.
Das ganze kann man hier testen:
Dateiupload mit Progressbar
(Nach dem hochladen wird die Datei per skript wieder gelöscht)
Probiert das am besten zunächst mit einer Datei so um die 500 KB aus. Wenn die zu klein ist sieht man nix vom Vorgang.
Nach dem Absenden wird ein neues Fenster geöffnet in dem dann der Vorgang dargestellt wird.
Nun mein Problem:
Zunächst wird die Datei scheinbar nur in das TEMP-Verzeichnis meines providers geschoben, und erst danach wandert die auf den eigentlichen Server. Das heisst meine Progressbar startet erst dann, wenn die Datei im Temp Pfad angekommen ist. Solange wird jegliche Browseraction gesperrt.
Nun dachte ich, prüfe ich halt mit der zweiten connection die dateigröße der temoprären datei, aber auf das tmp verzeichnis habe ich scheinbar keinen zugriff.
Anbieter ist 1und1, leider kein root server.
Dann dachte ich leg ich halt das temp verzeichnis woanders hin um das abzufragen, geht aber weder mit PHP mitteln, noch mit .htacsess.
Das ist dann auch schon das ganze problem.
Wenn jemand eine 10 MB Datei hochläd (Bis 10 MB gehts) dann glotzt der jenige zunächst auf ein weisses Fenster bis die Datei vom tmp ordner zum FTP-Server geschoben wird.
Nochmal zur Klarheit, die Datei wird nicht auf den Webspace sondern auf einen privaten FTP-Server geschoben. D.h. die Prozentanzeige gibt also nur die Werte aus die die Datei vom Temp-Verzeichnis des Webspaces zum FTP-Server braucht.
Hat einer eine Idee wie ich das lösen kann?
Vielen Dank im voraus.
zunächst einmal ein freundliches
PHP-Code:
echo "Hallo";
Ich habe ein PHP script zum upload von Dateien auf einen FTP-Server inkl. Progressbar in einer Mischung mit ein wenig JavaScript.
Das funktioniert soweit auch hervorragend.
Im Prinzip besteht das Script aus zwei Teilen:
1. Das gängige HTML Formular:
PHP-Code:
<form onsubmit="window.open('hinweis.html', 'upload',
'left=100,top=100,width=300,height=200')"
enctype="multipart/form-data" action="hochladen2.php"
target="upload" method="post">
<input name="lokale_datei" type="file" size="50" maxlength="1024">
<br>
<br><input type="submit" name="Abschicken" value="Abschicken" return="false"></form>
2. Der zweite Teil ist das eigentliche Script (relativ dirty):
PHP-Code:
<?php
if(isset($lokale_datei)) {
echo "<script language=\"JavaScript\">document.all.datei.innerText = \"$lokale_datei_name wird hochgeladen...\";</script>";
echo "<script language=\"JavaScript\">document.all.server.innerText = \"$Server\";</script>";
echo "<script language=\"JavaScript\">document.all.nutzer.innerText = \"$benutzer\";</script>";
$ftp_name = $Server; // Verzeichnis auf dem Server
$ftp_server = "..."; // IP-Adresse des Servers
$ftp_user_name = $benutzer;
$ftp_user_pass = $friendly;
ob_end_flush();
$remote_file = "/$Server/$benutzer/$lokale_datei_name";
$local_file = $lokale_datei;
$fp = fopen($local_file, 'r');
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
$ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
// Hier die zweite Verbindung zum Server
if(!isset($conn_id2)) {
$conn_id2 = ftp_connect($ftp_server);
$login_result2 = ftp_login($conn_id2, $ftp_user_name, $ftp_user_pass);
}
// Die aktuelle Dateigröße holen
if(isset($conn_id2)) {
clearstatcache();
$remote_file_size = ftp_size($conn_id2, $remote_file);
}
// Hier die Prozenberechnung
$local_file_size = filesize($local_file);
if (isset($remote_file_size) && $remote_file_size > 0 ){
$i = ($remote_file_size/$local_file_size)*100;
//convert number format
$number = number_format($i);
$progress = $number*2;
echo "<script language=\"JavaScript\">document.all.gross.innerText = \"$local_file_size Bytes\";</script>";
echo "<script language=\"JavaScript\">document.all.aktuell.innerText = \"$remote_file_size Bytes\";</script>";
echo "<script language=\"JavaScript\">document.Progress.width = " . $progress . ";</script>";
echo "<script language=\"JavaScript\">document.all.Fortschritt.innerText = \"" . $number . " %\";</script>";
flush();
}
$ret = ftp_nb_continue($conn_id);
}
if ($ret != FTP_FINISHED) {
print("Es ist ein unbekanter Fehler aufgetreten...<br>");
exit(1);
}
else {
// Need to setup the progress to 100 percent
$number = 100;
$progress = 200;
echo "<script language=\"JavaScript\">document.all.aktuell.innerText = \"$local_file_size Bytes\";</script>";
echo "<script language=\"JavaScript\">document.Progress.width = " . $progress . ";</script>";
echo "<script language=\"JavaScript\">document.all.Fortschritt.innerText = \"" . $number . " %\";</script>";
echo "<script language=\"JavaScript\">document.close.schliessen.disabled=false;</script>";
}
fclose($fp);
}
?>
Im groben und ganzen passiert hier folgendes:
Nachdem mit dem Server verbunden wurde, übertrage ich die Datei mittels: ftp_nb_fput da diese dann nicht gesperrt ist.
Im folgenden öffne ich dann eine zweite Verbindung bei der dann die Dateigröße auf dem Server abgefragt wird.
Dann wird noch prozentual die größe berechnet und per javascript der ganze krempel ausgegeben.
Die progressbar ist ein einfaches gif, dass per javascript einfach resized wird.
Das ganze kann man hier testen:
Dateiupload mit Progressbar
(Nach dem hochladen wird die Datei per skript wieder gelöscht)
Probiert das am besten zunächst mit einer Datei so um die 500 KB aus. Wenn die zu klein ist sieht man nix vom Vorgang.
Nach dem Absenden wird ein neues Fenster geöffnet in dem dann der Vorgang dargestellt wird.
Nun mein Problem:
Zunächst wird die Datei scheinbar nur in das TEMP-Verzeichnis meines providers geschoben, und erst danach wandert die auf den eigentlichen Server. Das heisst meine Progressbar startet erst dann, wenn die Datei im Temp Pfad angekommen ist. Solange wird jegliche Browseraction gesperrt.
Nun dachte ich, prüfe ich halt mit der zweiten connection die dateigröße der temoprären datei, aber auf das tmp verzeichnis habe ich scheinbar keinen zugriff.
Anbieter ist 1und1, leider kein root server.
Dann dachte ich leg ich halt das temp verzeichnis woanders hin um das abzufragen, geht aber weder mit PHP mitteln, noch mit .htacsess.
Das ist dann auch schon das ganze problem.
Wenn jemand eine 10 MB Datei hochläd (Bis 10 MB gehts) dann glotzt der jenige zunächst auf ein weisses Fenster bis die Datei vom tmp ordner zum FTP-Server geschoben wird.
Nochmal zur Klarheit, die Datei wird nicht auf den Webspace sondern auf einen privaten FTP-Server geschoben. D.h. die Prozentanzeige gibt also nur die Werte aus die die Datei vom Temp-Verzeichnis des Webspaces zum FTP-Server braucht.
Hat einer eine Idee wie ich das lösen kann?
Vielen Dank im voraus.
Kommentar