• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Dateiupload mit Statusanzeige

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Ich habe mir gerade überlegt, wie man eine Statusanzeige bei einem Dateiupload realisiert.

Ich habe daran gedacht, lokal ein PHP Skript auszuführen, dass mir entweder via GET/POST oder FTP-Protokoll Daten an den Server übermittelt. Mit JS (AJAX) könnte ich dann das PHP-Skript aufrufen und eine Statusanzeige realisieren.

Da ich lediglich in PHP gut bewandert bin und keine andere Programmiersprache erlernen möchte (aus zeitlichen Gründen, ist nur ein kleines Hobby), wäre ich um eine Lösung in PHP erwünscht.
 

_linx_

Kleiner Weinapfel
Registriert
04.01.09
Beiträge
1.125
Im Moment sieht es so aus:

Man ruft die test.html auf, klickt auf den Link und die test.php lädt eine Datei runter. Dabei wird kontinuierlich der Status in Prozent ausgegeben. Die test.html ruft diese ab und gibt jeweils die letzte Zeile aus.

test.php
Code:
<?php
    $fp = fsockopen("www.test.com", 80, $errno, $errstr, 30);
    $filesize = 7 * 1024 * 1024 + 90000;
    $file = null;
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "POST /DispMap.psd HTTP/1.1\r\n";
        $out .= "Host: www.test.com\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            $file .= fgets($fp, 128);
            $readen_bytes = strlen($file);
            $percent = $readen_bytes / $filesize * 100;
            echo $percent, "\n";
        }
        fclose($fp);
    }
    
    $handle = fopen('DispMap.psd', 'w+');
    fwrite($handle, $file);
    fclose($handle);
?>

test.html
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Insert title here</title>
        <script type="text/javascript">
            function ajaxBuild() {
                if(window.ActiveXObject) {
                    http_request = new ActiveXObject('Microsoft.XMLHTTP');
                }
                else if(window.XMLHttpRequest) {
                    http_request = new XMLHttpRequest();
                }
                http_request.onreadystatechange = showStatus;
                http_request.open('GET', 'test.php', true);
                http_request.send(null);
            }
            function showStatus() {
                if(http_request.readyState == 3) {
                        var answer;
                        answer = http_request.responseText.split("\n");
                        answer = answer.pop();
                        document.getElementById('status').innerHTML = answer;
                        window.setTimeout("emptyFunction()", 1000);
                }
            }
            function emptyFunction() {
            }
        </script>
    </head>
    <body>
        <a href="javascript:ajaxBuild()">Load File</a><br />
        <br />
        <div id="status">0</div>
    </body>
</html>

Die Probleme:

1. Im Firefox geht es ohne Probleme, der Fortschritt wird mir angezeigt. Safari zeigt mir während des ganzen Vorgangs gar nichts an. Das wäre das erste Problem, das zu lösen wäre.
edit: Safari ignoriert irgendwie den readyState 3…

2. Wie rufe ich die Dateigrösse mit den Socketfunktionen ab?

3. Das window.setTimeout funktioniert noch nicht, ich muss die Zeile wohl nach ganz oben in der Funktion schieben. Die Funktion ist auch ziemlich sinnfrei.

4. Die Downloadgeschwindigkeit unterliegt extremen Schwankungen. Getestet mit einer 150 MB grossen Datei.
Bildschirmfoto+2010-01-03+um+19.02.08.png


Das ganze ist halt momentan so aufgebaut, dass auf eventuelle Fehler überhaupt nicht eingegangen wird und dann halt eine riesige Fehlerflut kommt.

Wenn jemand Anregungen hat, bitte melden!
 
Zuletzt bearbeitet: