É, 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:
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.
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:
E montei o cabeçalho http com o seguinte trecho de código:
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");