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



Re: JSP Datei an den Browser streamen (fileproxy=

Autor: fgb
Datum: 15.05.2011 11:34:48

Nachtrag: Wollte den Beitrag löschen, da ich aus Zeitknappheit ein weiteren Post in einem anderen Forum erstellt habe. Leider finde ich keine Löschfunktion.

Also: Bitte um Entschuldigung



Re: JSP Datei an den Browser streamen (fileproxy=

Autor: reporter
Datum: 15.05.2011 19:40:22

Und wie lautet die Lösung für deine Problemstellung?



Re: JSP Datei an den Browser streamen (fileproxy=

Autor: fgb
Datum: 16.05.2011 13:43:33

> Und wie lautet die Lösung für deine
> Problemstellung?

Leider hab ich dort auch noch keine Lösung bekommen :-( Sonst hätte ich sie schon gepostet.

Hätte jemand eine Idee?

Danke und Grüße
Felix