[Resolvido] VRaptor - InputStreamDownload - Setar type?

4 respostas
R

Boa tarde pessoal,

Estou com um problema, e talvez a solução seja simples e eu não esteja enxergando.

A situação é a seguinte:

  • O usuário faz o upload de um arquivo da sua máquina para o servidor;
  • Esse arquivo depois de salvo no HD do servidor, é transformado em binário e salvo em um campo BLOB no Oracle (sim, é necessário fazer isso);
  • O usuário pode fazer o download desse arquivo, porém o Java está com um comportamento diferente em ambiente Windows (desenvolvimento) e Linux (servidor):
    • No Windows, o arquivo é enviado ao BLOB e depois recuperado sem problemas.
    • No Linux, ele é enviado corretamente, se eu pegar o conteúdo dele e montar um arquivo, fica perfeito. Porém se eu mando para o InputStreamDownload do VRaptor, o download vem sem as quebras de linhas.

Como eu consigo manipular a informação do BLOB corretamente nos dois ambientes, me parece que a questão está no InputStreamDownload, porque é somente quando forço o download por ele que acontece isso.

Alguém já passou por um problema parecido, ou tem alguma sugestão do que pode ser?

Os arquivos são sempre .txt.

Será que o contentType que estou setando no InputStreamDownload está errado? Coloco “text/plain”.

Muito obrigado, qualquer ajuda é muito bem vinda!

4 Respostas

G

Isso depende muito do código que você tem. Teria que ver quais são as transformações que você faz quando recebe o conteúdo, se lê linha por linha usando o System/line.separator ou se em byte e joga no clob/blob.

Além disso é errado dizer que no Linux não vem a quebra de linha. Ela vem sim, quem não vem é o retorno de linha, já que o notepad (você está abrindo por ele, correto?) precisa tando de um retorno quanto a quebra de linha. Se você abrir em um editor de verdade verá que as linhas estão normais.

Isso não tem a ver com o vraptor nem com o type do arquivo, mas sim como você lê o upload e grava na base de dados.

R

garcia-jj:
Isso depende muito do código que você tem. Teria que ver quais são as transformações que você faz quando recebe o conteúdo, se lê linha por linha usando o System/line.separator ou se em byte e joga no clob/blob.

Além disso é errado dizer que no Linux não vem a quebra de linha. Ela vem sim, quem não vem é o retorno de linha, já que o notepad (você está abrindo por ele, correto?) precisa tando de um retorno quanto a quebra de linha. Se você abrir em um editor de verdade verá que as linhas estão normais.

Isso não tem a ver com o vraptor nem com o type do arquivo, mas sim como você lê o upload e grava na base de dados.

Quando eu recebo o UploadedFile do arquivo enviado, eu pego o getFile() dele e gravo linha a linha, pode ser nesse momento né?

Como eu faria para pegar o binário dele e gravar diretamente sem “mexer” no conteúdo?

Tentei fazer aqui mas não saiu, ví que o PrintStream tem um método write(bytes[]), então tentei pegar o InputStream e dar um strem.toString.getBytes() e gravar, mas não deu certo.

Pode me ajudar, por favor?

Lucas_Cavalcanti

rodrigoalegre, acho que vc não entendeu o problema…

existem duas formas de quebrar linhas:

  • \r\n ou CRLF, que só o Windows usa
  • \n LF que todo mundo usa…

só o notepad abre errado se vc usar o \n sozinho, qqer outro editor mostra as quebras de linha corretamente.

R

Lucas Cavalcanti:
rodrigoalegre, acho que vc não entendeu o problema…

existem duas formas de quebrar linhas:

  • \r\n ou CRLF, que só o Windows usa
  • \n LF que todo mundo usa…

só o notepad abre errado se vc usar o \n sozinho, qqer outro editor mostra as quebras de linha corretamente.

Na verdade eu entendi, e já havia feito esse teste antes de postar o problema aqui, mas o garcia-jj estava certo.

Eu fazia o seguinte:

  • No upload do arquivo do computador do cara para o servidor, eu pegava o “buffer” do arquivo e gravava linha a linha no arquivo do servidor.

A cagada está ai, no Windows ele criava o arquivo com o mime type certo, então na hora de abrir estava tudo ok. Porém no linux, ele criava com outro mime type (acredito eu, não sei bem como o Linux trabalha com isso), então na hora de abrir pelo Windows, ele não reconhecia o arquivo e abria sem as quebras.

Estou fazendo assim agora:

  • No upload, eu pego o “buffer” do arquivo, pego o binário dele e gravo inteiro de um só vez no servidor, então ele vai com todas as informações (não somente o conteúdo como antes, mas com o mime type, etc).

Agora está perfeito, abre normalmente independente de se o arquivo subiu no servidor Linux ou Windows.

Apanhei um pouco para pegar o array de bytes do InputStream mas saiu.

Muito obrigado aos dois, me ajudaram muito!

Criado 26 de outubro de 2011
Ultima resposta 26 de out. de 2011
Respostas 4
Participantes 3