selfhtml.de - Alles für den Webmaster!

 

Empfehlung:

wix.com

Kostenlose Homepage

Besuchen Sie auch:

Jobs:

JSP Datei an den Browser streamen (fileproxy=

Autor: fgb [Beiträge: 10]
Datum: 14.05.2011 22:09:05

Hi zusammen,

ich habe ein Problem damit, über JSP Dateien an den Browser zu streamen.
Die Idee entsprich quasi einem DownloadProxy.

Folgendes Szenario, das bisher ohne Probleme funktioniert:

Ich lade per URLConnection eine Datei von einem HTTP-Server und schreibe ihn als Outputstream weiter an den Browser
Also:
-> 4 KB von der Quelle lesen (URLConnection -> InputStream)
-> 4 KB an den OutputStream senden (OutputStream),
und das so lange bis die Datei erfolgreich angekommen ist.
Das Szenario funktioniert soweit. Problem ist, wenn ich den Download pausiere, und dann fortsetzen will.
Was passiert, wenn ich auf Pause drücke?
1. Die Connection wird geschlossen
2. Der Browser merkt sich, wieviel er schon geladen hatte
3. Wenn ich resume anklicke, wird ein neuer HTTPRequest an die JSP Datei gesendet mit einem zusätzlichen Header-Attribut namens "Range" mit den bisher übertragenen Bytes.

Meine Aufgabe ist jetzt - sofern ich das richtig verstehe - dieses Attribut auszuwerten und den InputStream erst an der neuen Stelle fortzuführen (inputstream.skip(long skipped_bytes)).

Beispiel HTTP-Request für Range: "Range: bytes=3090780-"
Beispie HTTP-Response: "Content-Range: bytes 3090780-8236990/8236991"

Die hintere Zahl ist die Komplettgröße der Datei.
Die "Content-Length" beinhaltet die restliche zu übertragende Größe.

Das funktioniert allerdings nicht. Er fängt immer an 30 KB zu übertragen und wirft dann eine NullPointerException bei dem Write-Vorgang.

Hier mal mein Code:

private int DEFAULT_BUFFER_SIZE = 4096; // 4 KB

    public void dowbload(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        
        URL url = new URL("http://ftp.heanet.ie/pub/ubuntu-cdimage/releases/11.04/release/ubuntu-11.04-alternate-amd64+mac.iso");
        URLConnection con = url.openConnection();
        
        if (con == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        
        String range = request.getHeader("Range");
        int clength = con.getContentLength();

        if (range!=null)
            range = range.substring(range.indexOf("=")+1, range.length()-1);

        int realLength = 0;
        String writeString = "writing ";

        // file length = given range - complete size, if range is given
        realLength = (range!=null) ? (clength - Integer.parseInt(range)) : clength ;
        
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(con.getContentType());
        response.setContentLength(realLength);
        response.setHeader("Content-Disposition", "attachment; filename="ubuntu-11.04-alternate-amd64+mac.iso"");
        
        if (range!=null) {
            response.setHeader("Content-Range", "bytes " + range + "-" + clength + "/" + clength);
            writeString = "resuming";
        }
        
        InputStream in = con.getInputStream();
        OutputStream out = response.getOutputStream();
        
        try {
            
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length, sum = 0;
            
            sum = Integer.parseInt(range);
            
            while((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
                sum += length;
                System.out.println(writeString + " " + length + " kb (sum: " + sum+")");
            }
            
        } finally {
            close(out);
            close(in);
        }
    }


Ich komme nicht drauf, was ich falsch mache. Ggf. mach ich einen Fehler bei dem setzen des korrekten ResponseHeaders.

Hat jemand eine Idee?

Danke und viele Grüße
Felix


Beiträge

Antwort schreiben

Username: Usernamen registrieren
Passwort: Passwort vergessen?
Thema:
  Bitte benutze für deinen Beitrag die Groß-/Kleinschreibung!
Beitrag:
Link (URL):
Titel für Link:
Grafik (URL):
  Die Breite der Grafik darf 468 Pixel nicht überschreiten.
 
E-Mail-Benachrichtigung:



Zum Abschicken deines Beitrags bitte die Schaltfläche "Abschicken" nur einmal anklicken und warten. Der Server braucht manchmal einige Zeit, bis er den Beitrag in die Datenbank übernommen hat. Wenn du die Schaltfläche mehrmals drückst, erscheint dein Beitrag auch mehrmals im Forum.

Bewerten Sie Ihren Webhosting-Provider

Webhosting Provider bewerten und Apple iPad gewinnenWie zufrieden sind Sie mit Ihrem Webhosting-Provider? Gibt es Probleme beim Service, mit der Performance oder der Abrechnung?

Teilen Sie jetzt Ihre Erfahrungen mit anderen Webmastern und schreiben Sie eine Provider-Bewertung. Mit etwas Glück können Sie ein Apple iPad gewinnen!

Weitere Informationen und Teilnahme...