2012-12-19 18 views
11

aşağıdaki şekilde HTML5 özelliğini kullanarak bir ses/wav dışarı akışı için çalışıyorum: o tekrar ya da CurrentTime niteliğini yeniden konumlandırmak için imkansız gerçeği dışında,206 kodlu Grails'ten akış için ses dosyası nasıl sunulur?

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

Bu Chrome'da oldukça iyi çalışıyor:

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

aşağıdaki kodu kullanarak, bir Grails denetleyicisi ses dosyası ikram ediyorum:

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 
} 

Bu Grails olsa görünüyor i Yanlış ne olabileceğini

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 

konusunda fikrin: Chrome'dan aşağıdaki çıkışından gördüğünüz gibi bir HTTP yanıtı 200 yerine 206 (Kısmi-İçerik) geri vermeyi s?

Teşekkürler, Amit.

ADDITION:

için kontrolör mantığı değiştirme:

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 

mü HTTP 206 (Kısmi-İçerik) Ancak Chrome ve Firefox hem ses dosyası çalmıyor dönen yardımı (söz yine Chrome'un bir 200 dosyayı aldığımda tepkinin aşağıdaki bilgi ile) ...

Screenshot of Chrome's network console

oynamak yaptı:

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

Belki "response.status = 206" _before_ dosyasını düzenler misiniz? –

+1

Bu kesinlikle 206 kodunu almamıza yardımcı oldu (curl ile damping başlıklarına). Fakat

cevap

4

denemek isteyebilirsiniz:

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(...); 

Ve müşteri özellikle bir aralık için istenirse çıktı bu türü sadece yapılmalıdır. Sen kullanarak kontrol edebilirsiniz: aralık boş değilse

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

, o zaman başlangıç ​​ve bitiş bayt istekleri için aralık ayrıştırmak gerekir. "0-" aralığını bir aralık olarak alabileceğinizi unutmayın. Bazı durumlarda, hizmetinizin aralıklı istekleri nasıl işleyeceğini bilip bilmediğini görmek için "0-1" görürsünüz.

+1

Teşekkürler, bunu deneyecek! – amit

+1

Bu iş sizin için amitkapit yaptı mı? – raven