Erro ao recuperar arquivo?

4 respostas
A

Como vai pessoal?
Estou tendo um problema ao tentar recuperar arquivos acima de 2Kb do Banco de dados Oracle9i armazenados em um campo CLOB.
Digo acima de 2Kb, pois com arquivos menores não há problema.

Estou usando o servidor de aplicação Oracle9iAS. (O problema pode estar aqui! Em alguma configuração.)

Tenho uma classe que recupera arquivos de um banco de dados para que o usuário possa fazer o download dos mesmos.

O campo no banco que armazena os arquivos é um CLOB.

O campo é recuperado da seguinte maneira:



ByteArrayOutputStream baos = new ByteArrayOutputStream();

ResultSet rs = conn.createStatement().executeQuery(sql);



InputStream arquivo = rs.getBinaryStream(LOB_ARQUIVO);

int bytes_read = 0;

byte buffer[] = new byte[4096];

try

{

while((bytes_read = arquivo.read(buffer, 0, buffer.length)) != -1)

baos.write(buffer, 0, bytes_read);

arquivo.close();

}


O erro acontece quando tentamos recuperar arquivos acima de 2kb. Com arquivos menores não há problema.
Será que alguém pode me dar uma luz?
O erro que é exibido é esse:

500 Internal Server Error

java.lang.NullPointerException

at com.caa.classesnegocio.Chamado_ca.RetornarAnexo(Chamado_ca.java:1935)

at _caa__exibir__anexo._jspService(_caa__exibir__anexo.java:90)

[SRC:/caa_exibir_anexo.jsp:36]

at com.orionserver[Oracle9iAS (9.0.2.0.0) Containers for J2EE].http.OrionHttpJspPage.service(OrionHttpJspPage.java:56)

at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:302)

at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:407)

at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:330)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:336)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:59)

at oracle.security.jazn.oc4j.JAZNFilter.doFilter(JAZNFilter.java:283)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:523)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:269)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:735)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].server.http.AJPRequestHandler.run(AJPRequestHandler.java:151)

at com.evermind[Oracle9iAS (9.0.2.0.0) Containers for J2EE].util.ThreadPoolThread.run(ThreadPoolThread.java:64)

Muito Obrigado!
Alan.

4 Respostas

dukejeffrie

O que é que está escrito em volta dessa linha??

[SRC:/caa_exibir_anexo.jsp:36]

Vc sabe qual a referência que está nula?

A

Quando você diz:
[color=“darkblue”]O que é que está escrito em volta dessa linha??
[SRC:/caa_exibir_anexo.jsp:36] [/color]
Creio que você está se referindo ao JSP. Me corrija se eu estiver errado.
Bom, no JSP:


try
{

c = cp.getConnection();

[color=“green”] //Pego uma conexão[/color]
Integer intAnexo = CAAFormat.getInteger(request.getParameter(“Anexo”));

[color="green"]//Instancio a classe que eu descrevi anteriomente

[/color] cham = new Chamado_ca(c, ((Character)application.getAttribute(“chrTipoBanco”)).charValue(), ((CAAConnectionPool)cp).getCAAParametros());

if (intAnexo == null)
{
  response.setContentType("text/html");
  out.print("Anexo não Informado !!!");
  out.flush();
}
[color=“brown”]  //Linha 36: é a linha do else[/color]

else

{

Anexo_ca anexo = cham.RetornarAnexo(intAnexo, session.getId(), logado);

if (anexo.getMensagem()==null)

{

response.setContentType(anexo.getMimeType());

//        response.setContentType(“application/octet-stream”);

//        response.setContentLength((int)file.length());

response.setHeader(“Content-disposition”, “attachment; filename=” + anexo.getNomeArquivo());

ServletOutputStream so = response.getOutputStream();
[color="green"] //nesse trecho ele recupera o Arquivo[/color]
ByteArrayOutputStream b = anexo.getArquivo();

so.write(b.toByteArray(), 0, b.size());

so.flush();

}

else

{

response.setContentType(“text/html”);

out.print(anexo.getMensagem());

out.flush();

}

}

}

catch (SQLException e)

{

out.println(“Erro: + e.getMessage());

e.printStackTrace();

}


[color=“red”]Sobre eu saber que referencia está nula!
Eu não sei.[/color]

dukejeffrie

O seu erro diz que em algum lugar dentro do método RetornarAnexo tem uma referência (ponteiro) para alguma coisa nula sendo usada como se não fosse.

Se foi vc que fez o arquivo Chamado_ca.java ou tem acesso a ele, é melhor olhar o código lá (na linha 1935).

Se não, provavelmente é um dos seus parâmetros. Olhando por cima, parece que eles são todos tipos primitivos, nenhum objeto, verdade?

Alguma coisa é nula e não devia, isso dá pra saber.

A

Na linha 1935, não tem nada!!!
Eu já fui ver.
E em nenhuma outra linha que ele cita, a não ser na linha 36 do JSP, há problema.
O que eu gostaria de lembrar é que arquivos menores que 2kb, ele recupera normalmente…
E isso é que está intrigando!
Por que para arquivos maiores ele acusa uma referencia nula e para arquivos menores a coisa flui normalmente?
Desde já obrigado!

Criado 26 de fevereiro de 2003
Ultima resposta 27 de fev. de 2003
Respostas 4
Participantes 2