style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Leer un InputStream

Hola que tal.

Estoy realizando un sitio web que me permita ver archivo desde un FTP y me permita subir y bajar archivo, ya tengo la parte donde me muestra un listado de archivos y también la parte de subir archivos, el problema que tengo es al momento de bajar ya que no me permite bajar archivos pesados, esto es lo que llevo hecho.

Estoy realizando un servlet que me permita descargar un archivo.

Envio 3 parametros al servlet desde mi jsp que son el nombre del archivo, la carpeta donde esta el archivo y la ip de un ftp, tengo una clase NegFtps que invoca un método llamado negocio.bajaArchivo(fileName, filePath, servidor), en donde le paso parámetros para conectarse por FTP y bajar un archivo en especifico y este devuelve un InputStream después tengo un while donde leo el InputStream y lo escribo en el OutputStream, una vez que termina de leer el servlet regresa el archivo para ser descargado desde el explorador de internet.

Cuando descargo archivos pequeños como de 100KB no hay problema, pero cuando descargo archivo grandes como de 800KB o mas tarde demasiado y cuando lo guardo solo me guarda una parte, lo mas extraño es que los archivos que trunca los guarda siempre con 128KB, alguien sabrá una mejor manera de hacer la escritura al OutputStream o una mejor manera de bajar un archivo desde un FTP.

El servlet es el siguiente:

package baz.monitor.vista;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import baz.monitor.modelo.negocio.NegFtps;
public class DescargarArchivo extends HttpServlet {
        private static final int BUFSIZE = 1024;
       
        public DescargarArchivo() {
                super();
        }
        public void destroy() {
                super.destroy();
        }
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
               
                InputStream inp = null;
                       
                OutputStream outStream = response.getOutputStream();
               
            int length   = 0;
           
            String fileName = request.getParameter("fileName");
            String filePath = request.getParameter("filePath");
            String servidor = request.getParameter("servidor");
           
            System.out.println("fileName: " + fileName);
            System.out.println("filePath: " + filePath);
            System.out.println("servidor: " + servidor);
           
            if (servidor.equals("Conciliación")){
                servidor = null;
            }
                   
            try {
                    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
                                NegFtps negocio = new NegFtps();
                                inp = negocio.bajaArchivo(fileName, filePath, servidor);
                               
                        } catch (Exception e) {
                                System.out.println("error: " + e.getMessage());
                        }
                   
                    byte[] byteBuffer = new byte[BUFSIZE];
                   
                    try{
                            while ((inp != null) && ((length = inp.read(byteBuffer)) != -1)){
                                outStream.write(byteBuffer,0,length);
                            }
       
                    }catch (IOException e) {
                                System.out.println(e.getMessage());
                        }catch (Exception e) {
                                System.out.println(e.getMessage());
                        }
                    inp.close();
                   
                    outStream.close();
        }
        public void init() throws ServletException {
               
        }
       
}

El codigo que hace el envio por FTP es el siguiente:

public InputStream bajaArchivo(String archivo, String carpeta, String servidor) throws MyException{
               
                FTPClient cliente = new FTPClient();
                String mensaje = null;
                InputStream filein = null;
               
                sFtp = servidor;
               
                try{
                        /**Nos conectamos**/
                        cliente.connect(sFtp, sPort);
                        boolean login = cliente.login(sUsuario, sPassword);
                       
                        if(login){
                                System.out.println("conectado!!!!");
                        }else{
                                System.out.println("Tenemos un problema");
                        }
                                               
                        //validamos si la carpeta es la raiz
                        if (carpeta != null && !carpeta.trim().isEmpty()){
                                cliente.changeWorkingDirectory("\\" + carpeta);
                        }
                        System.out.println("Directorio raiz: " + cliente.printWorkingDirectory());
                       
                        //bajamos el archivo
                        int replay = cliente.getReplyCode();
                       
                        if(FTPReply.isPositiveCompletion(replay)){
                                System.out.println("conectado para bajar el archivo");
                       
                                cliente.setFileType(FTP.BINARY_FILE_TYPE);
                               
                                System.out.println("archivo: " + archivo);
                               
                                cliente.enterLocalActiveMode();
                                //fileout = new FileOutputStream(archivo);
                               
                                filein = cliente.retrieveFileStream(archivo);
                                //output = cliente.appendFileStream(archivo);
                                //bajo = cliente.retrieveFile(ftpsDto.getArchivoL(), fileout);
                               
                                if (filein != null){
                                        mensaje = "¡Archivo bajado correctamente!";
                                }else{
                                        mensaje = "¡El archivo no se pudo bajar!";
                                        throw new MyException("Error al bajar el archivo al FTPS");
                                }
                               
                                System.out.println("**************************************************");
                                System.out.println(mensaje);
                                System.out.println("**************************************************");
                        }else{
                                System.out.println("No se pudo bajar el archivo verifica que estás conectado");
                        }
                }catch(IOException e){
                        System.out.println("Exception: " + e.getMessage());
                        throw new MyException("Error al bajar el archivo al FTPS: " + e.getMessage());
                }finally{
                        try {
                                cliente.logout();
                        } catch (IOException e) {
                                System.out.println("cliente.logout: " + e.getMessage());
                        }
                        try {
                                cliente.disconnect();
                        } catch (IOException e) {
                                System.out.println("cliente.disconnect: " + e.getMessage());
                        }
                }
                return filein;
        }

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

lectura?

No veo el ciclo de lectura que mencionas.

esta en el servlet

aqui esta:

while ((inp != null) && ((length = inp.read(byteBuffer)) != -1)){
      outStream.write(byteBuffer,0,length);
}

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">