Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat 6.0大文件上载(>;2 GB)_Java_File Upload - Fatal编程技术网

Java Tomcat 6.0大文件上载(>;2 GB)

Java Tomcat 6.0大文件上载(>;2 GB),java,file-upload,Java,File Upload,我在使用大于2GB的文件进行HTTP文件上载时遇到问题。服务器和客户端都是64位的,因此从系统的角度来看,必须没有2GB的限制。我做了以下工作: 在阿帕奇 LimitRequestBody=0() 内置Tomcat连接器 maxPostSize=0() 我正在使用apachecommons文件上传。我还尝试使用ServerFileUpload setMaxFileSize方法设置最大文件大小 我能够上传小于2GB的文件(我成功尝试了1.88GB的文件)。请告诉我,我在这里遗漏了什么 更具体地说,

我在使用大于2GB的文件进行HTTP文件上载时遇到问题。服务器和客户端都是64位的,因此从系统的角度来看,必须没有2GB的限制。我做了以下工作:

  • 在阿帕奇 LimitRequestBody=0()
  • 内置Tomcat连接器 maxPostSize=0()
  • 我正在使用apachecommons文件上传。我还尝试使用ServerFileUpload setMaxFileSize方法设置最大文件大小

    我能够上传小于2GB的文件(我成功尝试了1.88GB的文件)。请告诉我,我在这里遗漏了什么

    更具体地说,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());
        }
    }
    

    我当然可能错了,但我没有发现即使是64位浏览器也能处理大于2GB的上传。问题不在于服务器,而在于浏览器。你会发现,奇怪的是,大多数现代浏览器都很乐意从标准服务器下载大于2GB的文件,不需要特殊配置。

    如果你希望上传这些大小的文件,我不会直接依靠浏览器上传。我的建议是使用Java小程序,或者甚至是Flash文件(如果可能的话,我不确定,而不是Flash人员),这样您就可以将文件分成块。如果上载被中断,您可以从上次停止的位置继续上载。

    Jsp代码:
    
    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;
        }
    
    var varb=''; var检验=0; var计数=1; $(函数(){ var maxChunkSize=30000000;//在此处设置块大小 var your_global_var_for_form_submit=''; 变量参数={ 年份:三个选定年份, 系列:三选系列 }; /*文件上载与表单绑定,'fileupload'是我的表单id。由sumit触发 乌洛德将提交我的表格存档*/ /*replaceFileInput:true*/ $('#fileupload')。fileupload({ maxChunkSize:maxChunkSize, url:efccustom.getEfcContext()+'upload/uploadZip?year='+threeDSelectedYear+'&series='+threeDSelectedSeries,//要上载文件的url 错误:函数(jqXHR、textStatus、errorshown){ //为每个失败的区块上载调用 $(“.fileupload加载”).html(“”); $('.ANALYZE_DIALOG')。对话框(“关闭”); }, 成功:函数(数据、文本状态、jqXHR){ /*上传成功后将调用此事件*/ count=parseInt($('#counter').val())+1; $('计数器').val(计数); $('#ttk').val(计数); data.ttk=7; console.log(“计数”,计数,数据); }, 提交:功能(e、数据){ /*本次活动将于我在此提交时召开 向窗体中添加变量*/ //console.log($('#zip_上传的_文件').val()); //console.log(data.originalFiles[0].name); 测试=数据原始文件[0]; $('#fname').val(data.originalFiles[0].name); $('#trequests').val(Math.ceil(data.originalFiles[0].size/maxChunkSize)); $('计数器').val('1'); }, 进度:功能(e、数据){ /*进度条码将显示在这里*/ $(“.fileupload loading”).html(“”); }, 添加:功能(e、数据){ $('.browsedFileName').html(data.originalFiles[0].name); 您的\u全局\u var\u for\u form\u submit=数据; }, 完成:功能(e,数据){ ajaxcall.Data.\u get('upload/extractZipNCreateJson',参数,函数(data2){ 警报(“文件上传成功”); $(“.fileupload加载”).html(“”); $('.ANALYZE_DIALOG')。对话框(“关闭”); }); } }); /*这是我提交表单的按钮点击事件*/ $(“#按钮”)。单击(函数(){ 您的表单提交的全局变量提交。提交(); }); }); 控制器代码: @RequestMapping(value=“/uploadZip”,method=RequestMethod.POST,consumes=“多部分/表单数据”) @应答器 公共责任 uploadZip(HttpServletRequest请求,HttpServletResponse响应) 抛出IOException、IllegalArgumentException{ 试试{ 字符串year=request.getParameter(“年”); 字符串系列=request.getParameter(“系列”); 日志信息(“年”+年+“系列”+系列); 布尔值isMultipart=ServletFileUpload.isMultipartContent(请求); if(isMultipart){ FileItemFactory=new DiskFileItemFactory(); ServletFileUpload upload=新的ServletFileUpload(工厂); 列表项=upload.parseRequest(请求); 迭代器迭代器=items.Iterator(); HttpSession session=request.getSession(); UserContext UserContext=(UserContext)会话 .getAttribute(ApplicationConstant.USER\u上下文); 字符串userName=userContext.getUser(); 字符串workSpaceInUse=userContext.getCurrentWorkSpace(); FileItem=null; 布尔fileNotExistFlag; 字符串文件扩展名; while(iterator.hasNext()){ item=(FileItem)迭代器.next(); 字符串内容=item.getContentType(); 日志信息(“内容”+内容); log.info(“上传的文件类型:+内容”); 如果(!item.isFormField()){ /*在IOUtils中,第三个参数true告诉我们需要将小数据块添加到同一个文件中*/ copy(fileItem.getInputStream(),新的FileOutputStream(新文件(threeDPath+“/”+year+“/”+series+“/”+uploadZipFileName),true); } } 返回null; } } 捕获(例外e){ 返回handleError(新的运行时异常(“上载ZIP时出现意外错误”),e); } 返回null; }
    如果您使用的是common fileupload 1.1或旧版,则您无法上载超过(1.9888)~2GB的文件。这里的问题是这个jar正在调用一个名为getContentLength的int类型的方法,因此您的请求只能处理最大为Integer.MAX_值的大小。最新