Dateiupload mit progressbar kleine Hilfe...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Dateiupload mit progressbar kleine Hilfe...

    Hallo Froumsgemeinde,

    zunächst einmal ein freundliches
    PHP-Code:
    echo "Hallo"
    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:

    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
    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):

    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$fpFTP_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 ){
               
    $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);
    }
    ?>
    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.
    [color=blue]...ich sehe was, was du nicht siehst...und das ist der QUELLTEXT![/color]

  • #2
    Schonmal http://php.net/manual/de/features.file-upload.php gelesen? Jeder Upload landet erstmal 'sicher' umbenannt in einem 'sicheren' Verzeichnis. Das muß auch sein, sonst ... na überlege dir mal was passieren würde, wenn jemand eine index.php hochlädt.

    Aus dieser Karantäne solltest du die Datei erstmal herausholen - mit move_uploaded_file() wenns geht.
    Dann kannst du das File auf den FTP-Server schieben.

    Kommentar


    • #3
      Re: Dateiupload mit progressbar kleine Hilfe...

      Original geschrieben von cipolla
      Zunächst wird die Datei scheinbar nur in das TEMP-Verzeichnis meines providers geschoben,
      Natürlich wird sie das.
      So und nicht anders funktioniert ein Dateiupload über HTTP mit PHP.

      Wenn der Upload ins Temp-Verzeichnis fertig ist, erst dann wird dein PHP-Script gestartet.
      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.
      Selbst wenn du ihn hättest, wüsstest du immer noch nicht, unter welchem Namen die Datei im Temp-Verzeichnis ab-/angelegt würde - diesen Namen erfährst du auch erst dann, wenn der Upload beendet ist und dein PHP-Script startet.
      Nochmal zur Klarheit, die Datei wird nicht auf den Webspace sondern auf einen privaten FTP-Server geschoben.
      Also wird der Traffic auch noch verdoppelt.
      Hat einer eine Idee wie ich das lösen kann?
      Gib dem User einen FTP-Zugang auf dem Zielserver, und lasse ihn ein FTP-Programm nutzen.
      Alles andere wäre Unfug.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Hallo onemorenerd,

        na klar, da habe ich ja auch alle anregungen für das script her. Aber genau das ist ja dass problem, dass die dateien zunächst im tmp verzeichnis landen ist aus sicht der sicherheit ja ok. eben aus diesem grund suche ich ja nach einer möglichkeit als tmp verzeichnis ein anderes anzugeben damit ich darauf zugreifen kann. Nur leider kann ich die php.ini ja nicht editieren, da nix root zugriff.
        Ich dachte am anfang auch nicht, dass die dateien im temp verzeichnis landen, da diese ja eigentlich auf einen ganz anderen server hochgeladen werden.
        [color=blue]...ich sehe was, was du nicht siehst...und das ist der QUELLTEXT![/color]

        Kommentar


        • #5
          Selbst wenn du ihn hättest, wüsstest du immer noch nicht, unter welchem Namen die Datei im Temp-Verzeichnis ab-/angelegt würde - diesen Namen erfährst du auch erst dann, wenn der Upload beendet ist und dein PHP-Script startet.
          Das ist natürlich blöd. ich dachte den namen erfahre ich sobald die datei angelegt wird.

          Gib dem User einen FTP-Zugang auf dem Zielserver, und lasse ihn ein FTP-Programm nutzen.
          Alles andere wäre Unfug.
          Genau das soll eben nicht gemacht werden, da es den 08/15 benutzern nicht zuzumuten ist ein ftp-Programm zu benutzen. (OT Chef)!

          Na ja, trotzdem schonmal danke.
          [color=blue]...ich sehe was, was du nicht siehst...und das ist der QUELLTEXT![/color]

          Kommentar


          • #6
            ... ein cent für jeden, der deine frage schonmal gestellt hat und nicht glauben konnte, dass es nicht geht...

            Kommentar

            Lädt...
            X