2012-03-03 31 views
5

Si verificano problemi con il caricamento di file HTTP con file superiori a 2 GB. Sia il server che il client sono a 64 bit, quindi non ci devono essere limitazioni di 2 GB dal punto di vista del sistema. Ho fatto la seguente:Caricamento file di grandi dimensioni Tomcat 6.0 (> 2 GB)

  1. In Apache LimitRequestBody = 0 (http://httpd.apache.org/docs/2.0/mod/core.html#LimitRequestBody)
  2. In Tomcat connettore maxPostSize = 0 (http://tomcat.apache.org/tomcat-5.5-doc/config/ajp.html)

Sto usando apache upload di file comuni. Ho anche provato a impostare la dimensione massima del file utilizzando il metodo ServerFileUpload setMaxFileSize.

Sono in grado di caricare file inferiori a 2 GB (ho provato con successo file 1.88GB). Per favore, dirigimi, cosa mi manca qui?

Per essere più specifici metodo ServletFileUpload.parseRequest ritorna 0 FileItems durante il caricamento di file di grandi dimensioni

Ecco il frammento di codice:

if (isMultipartForm()) { 
try { 
    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    factory.setSizeThreshold(SIZE_THRESHOLD);//SIZE_THRESHOLD = 4MB 
    ServletFileUpload upload = new ServletFileUpload(factory); 
     //upload.setFileSizeMax(3000000000L); Tried this too 
    upload.setProgressListener(progressListener); 
    items = upload.parseRequest(request); 
    if(items != null && items.size() == 0) 
    return new CommandResultSet(false, "NoItemsFoundInRequest"); 
    return new CommandResultSet(true, "" + ((items!=null) ? items.size() : "")); 
} catch(FileUploadException e) { 
    e.printStackTrace(); 
    System.out.println("Exception in MultipartFormManager. Can not parse request.");  
    return new CommandResultSet(false, e.getMessage()); 
    } 
} 
+0

Come si utilizza esattamente la libreria Apache? Mostraci il codice –

+0

Dovresti testare il tuo server con uno strumento da riga di comando come "wget" per escludere qualsiasi problema del server: dimensione del file codificata come numero intero nello stack, limite del file system ... –

+0

Quali sono i sintomi del tuo problema? Il trasferimento è bloccato o fermato? Qualche traccia dello stack del server? Che dire di attività "su filo" - guardarlo con wireshark. –

risposta

1

certamente può nuovo sbagliato, ma non ho trovato che anche il 64 bit I browser gestiscono caricamenti superiori a 2 GB. Il problema non è il server ma il browser. Scoprirete stranamente che la maggior parte dei browser moderni scaricherà felicemente file più grandi di 2 GB da un server standard, non è richiesta alcuna configurazione speciale.

+0

Potrebbe fornire qualsiasi link a supporto della risposta. Ho potuto trovare solo questo (http://www.motobit.com/help/ScptUtl/pa33.htm) ma non ero sicuro. – Sunil

+0

Ciao, grazie per riferimento, non ne ero a conoscenza. I miei commenti si basano sull'esperienza con Apache 2.2, IE e Firefox negli ultimi anni. È bello sapere di Chrome, non l'ho provato da un po '. Flash probabilmente non ti aiuterà neanche, devi inviare i dati in parti abbastanza piccole rispetto a un file così grande e le cose si fanno molto più lente. Tutti i servizi commerciali di cui sono a conoscenza non supportano più di 2 GB, a meno che non si utilizzi il loro software client. Con le informazioni di intestazione corrette, non vedo alcun motivo per cui Apache non possa gestire questi file. È l'handicap del browser. – Mike

+0

ecco il [collegamento alla voce bug di mozilla] (https://bugzilla.mozilla.org/show_bug.cgi?id = 215450) –

0

Se si prevedono caricamenti di file di queste dimensioni, non fare affidamento su un caricamento diretto del browser. Un'applet Java o forse anche un file Flash (non sono sicuro se possibile, non una persona Flash) sarebbe la mia raccomandazione, quindi puoi spezzare i file in blocchi. Se il caricamento è interrotto, puoi riprendere da dove era stato interrotto.

+0

Capisco che non sia affidabile, ma ci sono meno richieste di quella dimensione, quindi se posso almeno gestire tali richieste sarebbe fantastico. – Sunil

0
Jsp code : 
<script src="../lib/app/configurator.data.ajax.js" type="text/javascript"></script> 
<script src="../lib/ui/jquery.fileupload.js"></script> 
<html> 

<script language="Javascript"> 
var varb = ''; 
var test = 0; 
var count = 1; 
$(function() { 
var maxChunkSize = 30000000; //SET CHUNK SIZE HERE 
var your_global_var_for_form_submit = ''; 

var params = { 
     year: threeDSelectedYear, 
     series: threeDSelectedSeries 
}; 
/*File upload bind with form, 'fileupload' is my form id. As sumit triggers 
    for file ulaod will submit my form*/ 
/* replaceFileInput: true, */ 
$('#fileupload').fileupload({ 
maxChunkSize: maxChunkSize, 
url: efccustom.getEfcContext()+'upload/uploadZip?year='+threeDSelectedYear+'&series='+threeDSelectedSeries,    //URL WHERE FILE TO BE UPLOADED 
    error: function (jqXHR, textStatus, errorThrown) { 
    // Called for each failed chunk upload 
     $(".fileupload-loading").html(""); 
     $('.ANALYZE_DIALOG').dialog("close");  
    }, 

    success: function (data, textStatus, jqXHR) { 
    /*This event will be called on success of upload*/ 
    count = parseInt($('#counter').val()) + 1; 
    $('#counter').val(count); 

    $('#ttk').val(count); 
    data.ttk = 7; 
    console.log(" count ",count , data); 
    }, 

    submit: function (e, data) { 
    /*This event will be called on submit here i am 
        adding variable to form*/ 
    //console.log($('#zip_uploaded_file').val());  

    //console.log(data.originalFiles[0].name);    
    test = data.originalFiles[0]; 
    $('#fname').val(data.originalFiles[0].name); 
    $('#trequests').val(Math.ceil(data.originalFiles[0].size/maxChunkSize)); 
    $('#counter').val('1'); 
    }, 

    progress: function (e, data) { 
    /*PROGRESS BAR CODE WILL BE HERE */ 
     $(".fileupload-loading").html('<img src="../public/themeroller/images/throbber.gif" alt="Uploading Please Wait..." title="Uploading Please Wait...." />');  
    }, 

    add: function (e, data) { 
    $('.browsedFileName').html(data.originalFiles[0].name); 
    your_global_var_for_form_submit = data; 
    }, 

    done: function (e, data) { 

     ajaxcall.Data._get('upload/extractZipNCreateJson',params,function(data2) { 
      alert("file upload success "); 
      $(".fileupload-loading").html(""); 
      $('.ANALYZE_DIALOG').dialog("close"); 
     }); 


    } 

}); 
/*This is my button click event on which i am submitting my form*/ 
    $('#button').click(function(){ 
    your_global_var_for_form_submit.submit(); 
    }); 
}); 
</script> 

<html> 

<body> 


<form id="fileupload" enctype="multipart/form-data"> 
<div class="row fileupload-buttonbar"> 
<div class="span7"> 
<!--<input type="file" name="files" id="file" /> --> 

<input type="file" id="zip_uploaded_file" name="zip_uploaded_file" /> 
<input type="hidden" name="counter" id="counter" value="1" /> 
<input type="hidden" name="fname" id="fname" value="" /> 
<input type="hidden" name="trequests" id="trequests" value="1" /> 

<input type="hidden" name="ttk" id="ttk" value="1" /> 
<input type="button" id="button" name="button" value="submit" /> 
<span class='browsedFileName'></span> 
</div> 
</div> 
<!-- The loading indicator is shown during file processing --> 
<div class="fileupload-loading"></div> 
</form> 
</body> 


Controller COde : 
@RequestMapping(value = "/uploadZip", method = RequestMethod.POST, consumes = "multipart/form-data") 
    @ResponseBody 
    public ResponseEntity<String> 
    uploadZip(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, IllegalArgumentException { 
     try {  
     String year = request.getParameter("year"); 
     String series = request.getParameter("series"); 
     log.info(" year " + year + " series " + series); 
     boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
     if (isMultipart) { 

      FileItemFactory factory = new DiskFileItemFactory(); 
      ServletFileUpload upload = new ServletFileUpload(factory); 
      List items = upload.parseRequest(request); 
      Iterator iterator = items.iterator(); 

      HttpSession session = request.getSession(); 
      UserContext userContext = (UserContext) session 
        .getAttribute(ApplicationConstant.USER_CONTEXT); 
      String userName = userContext.getUser(); 
      String workSpaceInUse = userContext.getCurrentWorkSpace();   
      FileItem item = null; 
      boolean fileNotExistFlag; 
      String fileExtension; 
      while (iterator.hasNext()) { 
       item = (FileItem) iterator.next(); 

       String content = item.getContentType(); 
       log.info(" content "+content); 
       log.info(" File Type Getting Uploaded :"+content); 
       if (!item.isFormField()) { 
      /* Here in IOUtils the Third Parameter true tells that the small chunks of data that comes need to be added to the same File */ 
      IOUtils.copy(fileItem.getInputStream(), new FileOutputStream(new File(threeDPath+"/"+year+"/"+series+"/"+uploadZipFileName),true));    
       } 
      } 
      return null; 
     } 
     } 
     catch(Exception e) { 
      return handleError(new RuntimeException("Unexpected error while uploading ZIP", e)); 
     } 
     return null; 
    } 
1

Se si utilizza file di archivio comune 1.1 o precedente, non è possibile caricare morethan (1.9888) ~ 2 GB. Il problema qui è che questo jar chiama un metodo chiamato getContentLength che è di tipo int, quindi la tua richiesta può gestire solo la dimensione fino a Integer.MAX_VALUE. Nell'ultima versione di common-fileupload come 1.3 questo è stato risolto. Spero che questo aiuti.

Problemi correlati