JSP para Download de arquivos

Pessoal,
Estou com um problema para fazer uma JSP que faça download automático de um arquivo mp3.
Meu plano é o seguinto, após o usuário clicar em um link ele é remetido para uma página JPS que começa o download automático do arquivo.

Consegui este código:

  File fAttachStream = new File( dir + fileName ); 
   
  response.setContentType( "APPLICATION/OCTET-STREAM" ); 
  response.setHeader( "Content-Disposition", "attachment;filename=" + fileName ); 
  response.setContentLength( ( int )fAttachStream.length() ); 
  try { 
      
     ServletOutputStream stream = response.getOutputStream(); 
      
     BufferedInputStream fif = new BufferedInputStream( new FileInputStream( fAttachStream ) ); 
     int data; 
     while( ( data = fif.read() ) != -1 ) { 
         
        stream.write( data ); 
         
     } 
      
     fif.close(); 
     stream.close(); 
      
  } catch (IOException e) { 
      
     e.printStackTrace(); 
      
  }

========================================

Mas está retornando as seguintas mensagens de erro:

Generated servlet error:
File cannot be resolved to a type

Generated servlet error:
BufferedInputStream cannot be resolved to a type

Generated servlet error:
FileInputStream cannot be resolved to a type

Alguém sabe dizer o que está faltando?? Faltam os imports??? Mas quais??? :?

Consegui uma evolução, realmente estavam faltando os imports:

<%@ page language=“java” import=“java.io.,java.util.,javax.servlet.*” %>

Mas agora retorma a seguinte mensagem de erro:

=======================================
org.apache.jasper.JasperException: getOutputStream() has already been called for this response

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

========================================

Mas como??? Não estou chamando a função getOutputStream() dua vezes!!! :x

.

Consegui Resolver!!! :smiley:
Não houveram comentários no tópicos, só os meus… mas como o objetivo é ajudar a galera vou postar aqui o script que deu certo, caso alguém tenha a mesma dificuldade futuramente. :wink:

<%@ page language="java" import="java.io.*,java.util.*,javax.servlet.*" %>

<jsp:useBean  id="objCliente"  class="org.templojava.Cliente" />

<%
String nmusicac2=request.getParameter("mcomprada");
String nvalorc2=request.getParameter("vcomprada");
String nbandac2=request.getParameter("bcomprada");
String nfilec2=request.getParameter("mp3comprada");

String login=(String)session.getAttribute("Logado");
objCliente.setLogin(login);

objCliente.setCreditos(nvalorc2);

objCliente.CompraMusica();

String dir="c:/uploads/musica";
String fileName = nfilec2;

      File fAttachStream = new File( dir + fileName ); 
       
      response.setContentType( "APPLICATION/OCTET-STREAM" ); 
      response.setHeader( "Content-Disposition", "attachment;filename=" + fileName ); 
      response.setContentLength( ( int )fAttachStream.length() ); 
      try { 
          
         //ServletOutputStream stream = response.getOutputStream();
          
         BufferedInputStream fif = new BufferedInputStream( new FileInputStream( fAttachStream ) ); 
         int data; 
         while( ( data = fif.read() ) != -1 ) { 
             
            out.write( data ); 
             
         } 
          
         fif.close(); 
	 //stream.flush();
         //stream.close(); 
          
      } catch (IOException e) { 
          
         e.printStackTrace(); 
          
      }

%>