15 dezembro 2010

Embutindo Video em JSP's apenas com Servlet's ou Actions do Struts

É, eu sei, só eu em minha infelicidade ainda trabalho com Struts 1.3.x e EJB 2.1, mas enfim, é o que paga as minhas contas atualmente... A demanda que me tomou todas as energias na ultima semana é disponibilizar vídeos numa página JSP, utilizando apenas isso: struts e EJB 2.1. Encontrei alguma dificuldade, mas enfim consegui. E pra não esquecer como se faz (um detalhe extremamente sutil), eu vou blogar isso.

Tanto faz usar o a tag HTML5 <video>, a tag <embed> ou a tag <object>, eu encontrei sempre o mesmo problema. O que acontecia era que essas tags realizam uma dupla requisição ao servidor. A primeira, provavelmente, deve ser para solicitar os metadados do vídeo. Por isso você provavelmente encontrará uma exceção como essa no seu log:

ClientAbortException:  java.net.SocketException: 
Connection reset

Isso apenas quer dizer que, da primeira vez que o browser requisitou o video, você tentou mandar todo o video para ele, e ele encerrou o download no meio do caminho, possivelmente por necessitar apenas dos metadados para a seleção do plugin correto para tocar o video.

Sendo assim, ele fará uma segunda requisição para a mesma url. Daí você deverá novamente enviar o video como um todo para ele. Quem usa formularios do struts terá problemas (como eu tive) quando o dado está ainda em memória (caso o formulário esteja no escopo de requisição) ao invés de no disco ou base de dados.

UPDATE


Ao menos foi isso o que eu entendi, depois de tanto debugar a Action do Struts 1.3.10 que eu implementei. Embuti o video (mas ainda não consegui fazer aparecerem os controles de pausar, avabçar, retroceder e maximizar) com o seguinte trecho de código:

<center>
    <embed src="${urlVideo}" type="${mimetypeArquivo}"
              loop="1"
              autostart="true"
              width="640" 
              height="385">
    </embed>
</center>

E montei o cabeçalho http com o seguinte trecho de código:

response.setHeader("Cache-Control", 
         "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Content-Length", 
         String.valueOf(tamanhoDoArquivo));
response.setHeader("Accept-Ranges", "bytes");

Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;