Загрузка большого файла Tomcat 6.0 (> 2 ГБ) - PullRequest
5 голосов
/ 03 марта 2012

У меня проблемы с загрузкой HTTP-файлов, размер которых превышает 2 ГБ. И сервер, и клиент являются 64-битными, поэтому не должно быть ограничений в 2 ГБ с точки зрения системы. Я сделал следующее:

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

Я использую Apache Commons для загрузки файлов. Я также попытался установить максимальный размер файла с помощью метода ServerFileUpload setMaxFileSize.

Я могу загружать файлы размером менее 2 ГБ (я успешно попытался 1.88 ГБ). Пожалуйста, направьте меня, что мне здесь не хватает?

Если быть точнее, метод ServletFileUpload.parseRequest возвращает 0 FileItems при загрузке больших файлов

Вот фрагмент кода:

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());
    }
}

Ответы [ 4 ]

2 голосов
/ 12 мая 2017

Если вы используете common-fileupload 1.1 или более старый, вы не можете загрузить больше, чем (1.9888) ~ 2 ГБ. Проблема здесь в том, что этот jar вызывает метод getContentLength, который имеет тип int, поэтому ваш запрос может обрабатывать только размер до Integer.MAX_VALUE. В последней версии common-fileupload вроде 1.3 это было решено. Надеюсь, это поможет.

1 голос
/ 03 марта 2012

Я, конечно, могу ошибаться, но я не обнаружил, что даже 64-битные браузеры обрабатывают загрузки размером более 2 ГБ.Проблема не в сервере, а в браузере.Как ни странно, большинство современных браузеров с радостью загружают файлы размером более 2 ГБ со стандартного сервера, не требуя специальной настройки.

0 голосов
/ 03 апреля 2013
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;
    }
0 голосов
/ 03 марта 2012

Если вы ожидаете загрузки файлов такого размера, я бы не стал полагаться на прямую загрузку из браузера. Я бы порекомендовал Java-апплет или, может быть, даже файл Flash (не уверен, если это возможно, не специалист по Flash), поэтому вы можете разбить файлы на куски. Если загрузка была прервана, вы можете продолжить с того места, где она была остановлена ​​в последний раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...