servlets y archivos de texto

ferwasy
19 de Enero del 2006
Gente: estoy tratando de escribir un servlet muy sencillo, que simplemente lea archivos de matlab (extensión .m, para aquellos que no lo conocen son simplemente archivos de texto, que se pueden abrir sin problemas con cualquier editor de texto simple).

Primero, intenté con una aplicación java simple (de consola) que lea el archivo y me lo imprima por consola. Este es el código que usé:

package pruebas;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import jmatlink.JMatLink;

public class Prueba {

public static void main(String[] args) {

String archivo = "/path/al/archivo.m";
FileReader archivo1;
BufferedReader filtro;
String linea;
try {
archivo1 = new FileReader(archivo);
filtro = new BufferedReader(archivo1);
linea = filtro.readLine();
while (linea != null) {
System.out.println(linea);
linea = filtro.readLine();
}
} catch (IOException e) {
System.out.println("Error");
}

}
}

El código anterior funciona perfectamente para cualquier archivo de matlab (.m) que le indique, lo imprime por consola sin ningun tipo de problema.

Habiendo tenido éxito con esta simple aplicación de consola, intenté llevar la idea a un servlet. Primero, diseño una página html donde se puede elegir un archivo .m, de la siguiente manera: (el html esta comentado para poder postearlo acá).

<!--<html>-->
<!--<head>-->
<!--<meta content="text/html; charset=ISO-8859-1"
<!-- http-equiv="content-type">-->
<!-- <title></title>-->
<!--</head>-->
<!--<body>-->
<!--<br>-->
<!--<form enctype="multipart/form-data" method="get"-->
<!-- action="ProcesaInfo" name="archivos">-->
<!-- <input name="archivo" type="file"><br>-->
<!-- <br>-->
<!-- <input name="boton" value="Enviar" type="submit">-->
<!--</form>-->
<!--</body>-->
<!--</html>-->

y luego escribí el siguiente servlet:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProcesaInfo extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

public ProcesaInfo() {
super();
}


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
String archivo = request.getParameter("archivo");
FileReader archivo1;
BufferedReader filtro;
String linea;
try {
archivo1 = new FileReader(archivo);
filtro = new BufferedReader(archivo1);
linea = filtro.readLine();
while (linea != null) {
out.println(linea);
linea = filtro.readLine();
}
} catch (IOException e) {
out.println("Error");
}
}
}

Como ven, el codigo ue maneja al archivo es el mismo que el de la aplicacion de prueba que mencione anteriormente. El problema con el servlet es el siguiente: si pongo cualquier archivo de texto (con extension .txt) los muestra perfectamente en el html resultante. Si pongo algunos archivos de matlab extension .m, también los muestra perfectamente. Ahora, justo con los archivos .m que a mí me interesa procesar, sale por la excepción mostrando el mensaje "error". Encima, no puedo distinguir, si es que hay, alguna diferencia entre los archivos .m que el servlet muestra bien y aquellos en los que tira el error.

¿Qué estoy haciendo mal?

Gracias.

Eric Mignot
19 de Enero del 2006
Hola,

Teniendo en cuenta el hecho que el servlet functiona con algunos ficheros, yo diriria que el problema viene del metodo get usado para enviar los datos.

En efecto, el get tiene un tamano bastante pequeno y supongo que los ficheros que te interesan son ficheros de la vida real, es decir bastante grandes.

Puedes intentar cambiar en tu formulario html el atributo method de get a post ?

Lazaro Coronado Torres
19 de Enero del 2006
Ese servlet solo le funciona si el servidor de aplicaciones y el cliente(browser) estan en la misma maquina, asi que la unica manera de que el servlet reciba el archivo y lo muestre es que lea del InputStream del HttpServletRequest y ahi si puede mostrarlo o bajarlo a disco, y la excepción que genera el servlet es que la instrucción request.getParameter("archivo") devuelve null ya que al colocar dentro del formulario el enctype="multipart/form-data" este no manda los input como los manda normalmente sino que los manda tambien por el InputStream.

Eric Mignot
19 de Enero del 2006
Hola,

Si lo permites, una pequena cosa :
No nesecita el "implements javax.servlet.Servlet ", pues la classe "javax.servlet.http.HttpServlet" ya lo hace