• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

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