Re: Upload de arquivo de áudio

25 views
Skip to first unread message

Lucas Cavalcanti

unread,
May 21, 2012, 9:56:22 PM5/21/12
to caelum-vr...@googlegroups.com, caelum-vraptor
O ideal é vc usar o @Consumes e criar um Deserializer pra wave...

daí vc faz o seguinte:

@Consumes("audio/x-wav")
public void metodo(ArquivoWave wave) {
   ....
}

@Component
public class WaveDeserializer implements Deserializer {
    
    public Object[] deserialize(InputStream inputStream, ResourceMethod method) {
          // le esse inputStream e transforma em um ArquivoWave e retorna new Object[] {arquivoWave}
    }

}

não sei como funciona essa fiddler, mas a gente geralmente passa o InputStream direto pra biblioteca ler o que ela precisa...
não precisa ficar lendo buffer por buffer...

PS: essa discussão deveria estar na lista caelum-vraptor, e não na caelum-vraptor-dev, já que é sobre o uso do VRaptor, redirecionando, por favor responda pra caelum-vraptor...

2012/5/21 Felipe Araújo <felip...@gmail.com>
Olá pessoal,

Estou desenvolvendo meu trabalho de final de curso(\o/) com o VRaptor.
Uma das etapas é fazer um upload de áudio para o servidor.
Porém, o arquivo não está armazenado na máquina do cliente: ele é
capturado usando uma biblioteca Javascript+Flash(https://
code.google.com/p/wami-recorder/) para capturar o áudio em formato
wave. Uma típica requisição HTTP para o servidor é no seguinte
formato:

-----------------------------------------
POST http://localhost:8080/classifier/audio/capture HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 112684
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML,
like Gecko) Chrome/19.0.1084.46 Safari/536.5
content-type: audio/x-wav
Accept: */*
Referer: http://localhost:8080/classifier/wami/Wami.swf
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: JSESSIONID=DA6B73F2A51775789D54E33964B5467A

RIFF$� �WAVEfmt  ��� � �"V��D��� � �data�� ���������������(mais
dados....)
-----------------------------------------------------
onde "RIFF$� �WAVEfmt [...]" é o payload da requisição e contém o
arquivo wave. O que eu preciso fazer então é ler os bytes desse
payload, tal qual eles vêm, e salvá-los num arquivo com extensão .wav.
Já testei capturar as requisições com o Fiddler(http://
www.fiddler2.com/fiddler2/) e vejo que os bytes são enviados
corretamente, porém no meu controller o que obtenho chamando

request.getInputStream().read(buffer)

é diferente daquilo que foi enviado na requisição. Desta forma, o
arquivo não é salvo corretamente no servidor.

O que posso estar fazendo de errado?
Obs: para fazer a captura, criei uma anotação, @WavUploadTarget, e um
interceptor, WavUploadInterceptor.


Abs!


--
You received this message because you are subscribed to the Google Groups "caelum-vraptor-dev" group.
To post to this group, send email to caelum-vr...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor-dev?hl=en.


Felipe Araújo

unread,
May 22, 2012, 12:06:28 AM5/22/12
to caelum-vraptor

Então, Lucas, resolveu sim, mas na classe WaveDeserializer eu coloquei
a anotação @Deserializes("audio/x-wav") [e não @Component ] e no
método do meu controller o @Consumes("audio/x-wav").

Algo que me consumiu um tempinho é que eu havia escrito
@Deserializes("audio/x-wavE") e o servidor retornava 'HTTP Erro 415
Unsupported media type'. Foi só corrigir o tipo MIME na anotação que
deu certo.

Quanto ao Fiddler, ele apenas captura a requisição HTTP tal qual ela
vai para o servidor... bastante útil em algumas situações.

Muito Obrigado!


Abs,

On 21 maio, 22:56, Lucas Cavalcanti <lucasmrtu...@gmail.com> wrote:
> O ideal é vc usar o @Consumes e criar um Deserializer pra wave...
>
> daí vc faz o seguinte:
>
> @Consumes("audio/x-wav")
> public void metodo(ArquivoWave wave) {
>    ....
>
> }
>
> @Component
> public class WaveDeserializer implements Deserializer {
>
>     public Object[] deserialize(InputStream inputStream, ResourceMethod
> method) {
>           // le esse inputStream e transforma em um ArquivoWave e retorna
> new Object[] {arquivoWave}
>     }
>
> }
>
> não sei como funciona essa fiddler, mas a gente geralmente passa o
> InputStream direto pra biblioteca ler o que ela precisa...
> não precisa ficar lendo buffer por buffer...
>
> PS: essa discussão deveria estar na lista caelum-vraptor, e não na
> caelum-vraptor-dev, já que é sobre o uso do VRaptor, redirecionando, por
> favor responda pra caelum-vraptor...
>
> 2012/5/21 Felipe Araújo <felipe....@gmail.com>
Reply all
Reply to author
Forward
0 new messages