[WW] Content type

7 respostas
_fs

Olá pessoal, boa tarde.

Ambiente: fire fox, webwork 2.0

Fiz uma action que retorna um arquivo qualquer carregado do banco. Configuro o contentType corretamente com HttpServletResponse.setContentType( “etc” )

Quando faço o teste com imagens (bmp, jpg, gif), o browser mostra os arquivos normalmente.

O problema ocorre com arquivos diferentes, como .doc ou .xls. O comportamento normal do FireFox é mostrar uma caixa de diálogo com as opções “Open With” e “Save to Disk”, sendo que há uma sugestão de software para abrir o arquivo ( Microsoft Word para arquivos com a extensão .doc, por exemplo ). Porém, o nome do arquivo é “minhaAction.action”, fazendo com que a sugestão de software não exista. Se indico o caminho correto até o .exe do Word, o arquivo é aberto com sucesso.

Pensei que configurar o content-type corretamente bastaria, mas infelizmente não.

Mais bizarro quando tento executar essa action no IE. Os bytes são impressos na página.

Lembrando que tudo funciona normalmente com imagens :expressionless:

Pensei em criar o arquivo em disco, para então acessá-lo com o browser, mas penso que seria um (grande) gasto desnecessário de recursos do servidor.

Alguém tem alguma sugestão para resolver este problema?

Valeu pessoal :smiley:

7 Respostas

smota

Olá Lipe,

Por aqui fazemos isso sem grandes problemas … mas no caso criamos um RESULT próprio. Dê uma conferida se fazer isso na action realmente seta ou se o result que vc tá usando (dispatcher?) em algum momento fixa isso.

Se estiver usando o Sitemesh tb confira, embora a nova versão se vire bem com tudo quanto é content-type versões mais antigas as vezes decoravam saída binárias e ferravam tudo.

Quanto ao nome isso vai do HTML mesmo, tem um outro header pra setar e sugerir o nome.

_fs

Hum, está sugerindo que faça um result para cada tipo de arquivo? Ou é possível fazer um result genérico no qual eu realmente tenha controle sobre o content-type?

Sobre o nome, agora que falou me lembrei :smiley: tem um tópico aqui no fórum sobre isso \o/

Valeu mesmo smota :smiley:

danieldestro

Olha o que eu fiz sexta passada:

if( compactar ) { //compactar para zip response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment; filename=dados.zip"); makeZip( text.toString(), response.getOutputStream() ); response.getOutputStream().flush(); } else { //exibir como TXT response.setContentType("text/plain;charset=ISO-8859-1"); response.setHeader("Content-Disposition", "attachment; filename=dados.txt"); request.setAttribute( "text", text.toString() ); }

_fs

Valeu Daniel ;D pena que não resolve no meu caso hehe o smota está certo, o WW está redirecionando a página. Portanto preciso juntar sua solução à do dele :smiley:

smota

Existe um result chamado HttpHeader que você deve conseguir usar (eu fiz o meu pq esse ainda era muito sem vergonha).

Veja: http://www.opensymphony.com/webwork/wikidocs/Result%20Types.html#ResultTypes-HttpHeader

PS: Vendo bem talvez não dê pra vc usar não, dê uma estudade nele e se precisar fazer o seu use o mesmo conceito, ou seja, o result é um só mas em cada lugar você passa como parâmetro o tipo que quiser, inclusive pode usar variáveis pra serem processadas na ValueStack.

_fs

Mmmmmmmmmuito obrigado smota ;D

_fs

Bem pessoal, não consegui fazer do jeito chique por hora, e os prazos estão começando a ficar vermelhos :mrgreen: então fiz uma gambiarra com velocity

$res.setHeader( “Content-Disposition”, “inline; filename=$fileName” )
$res.setHeader( “Content-Type”, “$contentType” )

gambiarra feia feia :expressionless:

Criado 20 de setembro de 2004
Ultima resposta 21 de set. de 2004
Respostas 7
Participantes 3