2012-12-19 5 views
11

Ich versuche, ein Audio/wav mit HTML5-Funktion in folgenden Weise zu ausströmen:Wie wird eine Audiodatei zum Streamen von Grails mit Code 206 bereitgestellt?

<audio type="audio/wav" src="/sound/10/audio/full" sound-id="10" version="full" controls=""> 
</audio> 

Diese recht gut auf Chrome funktionieren, außer die Tatsache, ist es unmöglich, wiederholen oder das current Attribut neu zu positionieren:

var audioElement = $('audio').get(0) 
audioElement.currentTime 
> 1.2479820251464844 
audioElement.currentTime = 0 
audioElement.currentTime 
> 1.2479820251464844 

ich diene die Audiodatei von einem Grails-Controller, folgenden Code:

def audio() { 
    File file = soundService.getAudio(...) 
    response.setContentType('audio/wav') 
    response.setContentLength (file.bytes.length) 
    response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 
    response.outputStream << file.newInputStream() // Performing a binary stream copy 
    response.status = 206 

    return false 
} 

Es scheint, obwohl Grails i s gibt eine HTTP-Antwort 200 statt 206 (Teil-Inhalt) zurück, wie Sie aus der folgenden Ausgabe von Chrome zu sehen:

Request URL:http://localhost:8080/sound/10/audio/full 
Request Method:GET 
Status Code:200 OK 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:identity;q=1, *;q=0 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Cookie:JSESSIONID=9395D8FFF34B7455F937190F521AA1BC 
Host:localhost:8080 
Range:bytes=0-3189 
Referer:http://localhost:8080/cms/sound/10/edit 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko)     Chrome/23.0.1271.97 Safari/537.11 
Response Headersview source 
Content-disposition:attachment;filename=full.wav 
Content-Length:3190 
Content-Type:audio/wav 
Date:Wed, 19 Dec 2012 13:58:44 GMT 
Server:Apache-Coyote/1.1 

Jede Idee, was falsch sein könnte?

Danke, Amit.

ADDITION:

Ändern der Controller-Logik auf:

response.status = 206 
response.setContentType(version.mime) 
response.setContentLength (file.bytes.length) 
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 
response.outputStream << file.newInputStream() // Performing a binary stream copy 

Did Hilfe bei der Rückkehr HTTP-206 (Teil-Inhalt), aber beide Chrome und Firefox nicht die Audiodatei (Erwähnen wieder taten Chrome spielen, wenn es die Datei mit einem 200 bekam ...)

Screenshot of Chrome's network console

mit den folgenden Informationen der Antwort:

Request URL:http://localhost:8080/sound/10/audio/full 
Request Headersview source 
Accept-Encoding:identity;q=1, *;q=0 
Range:bytes=0- 
Referer:http://localhost:8080/cms/sound/10/edit 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11 
+2

Vielleicht setzen Sie "response.status = 206" _before_ streamen Sie die Datei? –

+1

Dies hat definitiv geholfen, den Code 206 zu bekommen (Kopfzeilen mit Curl dumping). Aber dann

Antwort

4

Sie könnten versuchen wollen:

response.reset(); 
response.setStatus(206); 
response.setHeader("Accept-Ranges", "bytes"); 
response.setHeader("Content-length", Integer.toString(length + 1)); 
response.setHeader("Content-range", "bytes " + start.toString() + "-" + end.toString() + "/" + Long.toString(f.size())); 
response.setContentType(...); 

Und diese Art der Ausgabe sollte nur dann erfolgen, wenn der Kunde speziell für einen Bereich gefragt. Sie können prüfen, mit:

String range = request.getHeader("range"); 

wenn Bereich nicht null ist, dann werden Sie den Bereich für die Start- und End-Byte-Anforderungen analysieren müssen. Beachten Sie, dass Sie "0-" als Bereich haben können. In einigen Fällen sehen Sie "0-1" als Anforderung, um zu sehen, ob Ihr Dienst weiß, wie Bereichsanforderungen behandelt werden.

+1

Danke, werde das versuchen! – amit

+1

Hat dies für Sie amitkapit funktioniert? – raven

Verwandte Themen