Servlets - subir archivos grandes con fileupload

   
Vista:

subir archivos grandes con fileupload

Publicado por mario castellanos (2 intervenciones) el 13/01/2009 13:57:02
Estoy utilizando la libreria fileupload para subir archivos al servidor, funciona todo perfecto hasta con archivos de 4MB, pero cuando trato de subir archivos de un tamaño superior por decir de 11MB ya no funciona. El problema se debe a que como se realiza la peticion al servlet donde se lleva a cabo el proceso para subir el archivo, tarda mucho en responder por ese motivo se reinicia la conexion al servidor.
para evitar que se tengo que seguir operando en el sistema (entonces se siguen realizando peticiones al servidor y no se cierra la conexion, y los archivos grandes si se suben correctamente).

En resumen la libreria fileupload si funciona bien para archivos grandes pero mientras siga operando en el sistema. Lo que yo quiero es poder dejar subiendo el archivo, mientras yo me pueda ir a dormir.

Como puedo solucionar ese problemita. Hay algun archivo de configuracion del tomcat donde yo pueda configurar para que nose reinicie la conexion. Pero otra solucion que yo estaba pensando es realizar peticiones al servidor en forma automatica paralelamente mientras sube el archivo. Pero no se como hacerlo.

Les dejo el codigo donde realizo el proceso para subir el archivo. El metodo donde se realiza el proceso subida del archivo es procesaFicheros(HttpServletRequest req,HttpServletResponse res), los demas metodos son complemetarios donde se guarda datos a la base de datos otras cosas mas.

Codigo fuente:

package util.file;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.Servlet;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import java.util.*;

import util.Consultas;
import util.dbconector;
import util.calendar.Calendario;
import util.image.ImageEditor;

/**
* Servlet implementation class for Servlet: FileManager
*
*/
public class FileManager extends HttpServlet{
dbconector db;
String cp="";
String mensaje="";
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

boolean b=subirArchivo(req,res);
if(b){
res.getWriter().print("<center><h2 style='color:blue'>Archivo Subido Exitosamente</h2></center>");
}else{
res.getWriter().print("<center><h2 style='color:blue'>"+mensaje+"</h2></center>");
}
}

protected boolean subirArchivo(HttpServletRequest req,HttpServletResponse res){
if(procesaFicheros(req,res))return true;
return false;
}

public boolean procesaFicheros(HttpServletRequest req,HttpServletResponse res) {
try {

String desc="";
String carpet="";
String dir="";
File fichero=null;
// construimos el objeto que es capaz de parsear la perici�n
DiskFileUpload fu = new DiskFileUpload();
// maximo numero de bytes
fu.setSizeMax(1024*1024*1024);
// tamaño por encima del cual los ficheros son escritos directamente en disco
fu.setSizeThreshold(4096);
// directorio en el que se escribirïán los ficheros con tamaño superior al soportado en memoria
fu.setRepositoryPath("C:/temp");
//ordenamos procesar los ficheros
List fileItems = fu.parseRequest(req);
if(fileItems == null)return false;
// Iteramos por cada fichero
Iterator i = fileItems.iterator();
FileItem actual = null;
int ctd=0;
while (i.hasNext())
{ctd++;
actual = (FileItem)i.next();
if ( ! actual.isFormField() )//verificamos si es archivo
{
String fileName = actual.getName();
if(existe(fileName, carpet))return false;
System.out.println(actual.getName());
File destino=new File("D:/Ficheros/"+dir+"/");
if(!destino.exists()){
mensaje="El destino no existe o ha sido removido";
return false;
}
fichero = new File(fileName);
fichero = new File("D:/Ficheros/"+dir+"/"+ fichero.getName());
actual.write(fichero);
}
else{
System.out.println(actual.getString()+" nro="+ctd);
if(ctd==1){carpet=actual.getString();cp=carpet;}
else if(ctd==2)desc=actual.getString();
else if(ctd==3)dir=actual.getString();
}
}
adicionarFile(req,fichero,desc,carpet,dir);
}

catch(Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public void adicionarFile(HttpServletRequest req,File file,String desc,String carpet,String dir){
int tam=((int)file.length())/1024;
String fecha=Calendario.getFecha()+" "+Calendario.getHora();
String nombre = file.getName();
String ext = file.getName().substring(file.getName().lastIndexOf(".")+1);
ext=ext.toLowerCase();
String sql="select codta,codcon from tipo_archivo where extension='"+ext+"'";
System.out.println(sql);
db = new dbconector();
Object obj[][]=db.seleccion(sql);
db.close();
String tipo="17";
int largo=db.getFilas();
if(largo!=0)tipo=obj[0][0].toString();

db = new dbconector();
db.consulta(Consultas.createFile(tipo, nombre, fecha, String.valueOf(tam), carpet, "1",desc,dir));
if(largo!=0)
if(obj[0][1].toString().equals("3")){
createThumb(nombre,dir,tipo);
}

registrar(req, fecha, "7", nombre);
}
protected void registrar(HttpServletRequest req,String fecha,String acc,String nombre){
HttpSession sesion = req.getSession(true);
String ci = (String)sesion.getAttribute("USER_CI");
db = new dbconector();
db.consulta(Consultas.regAccion(ci, nombre, fecha, acc));
}
protected void createThumb(String name,String uri,String tipo){
System.out.println("creando miniatura");
String origen="D:/Ficheros"+uri+"/"+name;


String destino=this.getServletContext().getRealPath("/")+"thumbs/"+name;
if(tipo.equals("9"))ImageEditor.createGifImage(origen, destino);
else ImageEditor.createImage(origen, destino);
}
protected boolean existe(String nom,String car){
db = new dbconector();
db.seleccion(Consultas.verificaExistencia(car, nom));
if(db.getFilas()>0){
mensaje="Archivo ya existe";
return true;}
return false;
}
}


Agreadesco de antemano su ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:subir archivos grandes con fileupload

Publicado por SIxto (1 intervención) el 24/10/2009 22:48:49
mira, cheka esta pagina :P jaja

http://www.lawebdelprogramador.com/news/mostrar_new.php?id=85&texto=Servlets&n1=521185&n2=0&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

subir archivos grandes con fileupload

Publicado por ubirajara (2 intervenciones) el 24/10/2011 19:00:16
Es sensillo solo tienes que modificar unos parametros en el web.config en el tag de system.web

<system.web>
<!-- etc, etc-->
<httpRuntime maxRequestLength="20000" executionTimeout="360"/>
</system.web>

Asi te soporta archivos de 20,000 bytes (20Mb aprox) y un tiempo de espera de 360 segundos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

subir archivos grandes con fileupload

Publicado por ubirajara isc.erthal@ieee.org (2 intervenciones) el 24/10/2011 19:01:43
Disculpa no habia visto que tu codigo esta en java,
.net usa un archivo llamado web.config donde puedes controlar eso, espero que exista algo similar en java
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar