2012-03-03 163 views
5

2GBを超えるファイルでHTTPファイルアップロードに関する問題が発生しています。サーバーとクライアントの両方が64ビットなので、システムの観点からは2GBの制限がなければなりません。 = 0(http://tomcat.apache.org/tomcat-5.5-doc/config/ajp.html)Tomcatのコネクタ maxPostSizeでのApache LimitRequestBody = 0(http://httpd.apache.org/docs/2.0/mod/core.html#LimitRequestBodyTomcat 6.0大ファイルアップロード(> 2 GB)

    私は、Apacheコモンズのファイルのアップロードを使用しています:私は次のようでした。また、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()); 
        } 
    } 
    
  • +0

    どのように正確にapacheライブラリを使用していますか?コードを私たちに教えてください。 –

    +0

    "wget"のような生のコマンドラインツールを使用してサーバーをテストして、サーバーの問題を除外する必要があります。スタックのどこかで整数としてエンコードされたファイルサイズ、ファイルシステムの制限... –

    +0

    問題の症状は?転送が停止または停止していますか?任意のサーバースタックトレース? "ワイヤー上の"活動はどうですか?wiresharkで見てください。 –

    答えて

    1

    私は確かに新しい間違っているかもしれませんが、私も64ことが判明していませんbitブラウザは2GBを超えるアップロードを処理します。問題はサーバーではなくブラウザである。あなたは奇妙なことに、ほとんどの最新のブラウザが標準的なサーバーから2GBを超えるファイルを幸せにダウンロードできるようになります。特別な設定は必要ありません。

    +0

    あなたの答えをサポートするリンクを教えてください。私はこれを見つけることしかできませんでしたが(http://www.motobit.com/help/ScptUtl/pa33.htm)、私は自信がありませんでした。 – Sunil

    +0

    こんにちは、参考に感謝していませんでした。私のコメントは、Apache 2.2、IE、Firefoxの過去数年間の経験に基づいています。 Chromeについて聞くと良いですが、しばらくテストしていませんでした。 Flashはおそらくあなたを助けてくれないでしょう。そのような大きなファイルに比べてかなり小さい部分でデータを送信しなければならず、作業がずっと遅くなります。私が知っているすべての商用サービスは、お客様のクライアントソフトウェアを使用しない限り、2GBを超えてサポートされません。正しいヘッダー情報では、Apacheがこれらのファイルを処理できない理由はありません。ブラウザのハンディキャップです。 – Mike

    +0

    ここに[mozillaのバグエントリへのリンク](https://bugzilla.mozilla.org/show_bug.cgi?id = 215450) –

    0

    これらのサイズのファイルをアップロードする予定がある場合は、まっすぐなブラウザのアップロードには依存しません。 Javaアプレットか多分Flashファイル(可能であれば、Flashの人ではないかどうかはわかりません)が私の推奨になるので、ファイルを複数の塊に分割することができます。アップロードが中断された場合は、最後に中止した場所から再開することができます。

    +0

    私はそれが信頼できないことを理解していますが、そのサイズの要求が少ないので、少なくとも私はそのような要求を処理することができれば素晴らしいでしょう。 – 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

    common-fileupload 1.1以降を使用している場合、morethan(1.9888)〜2GBをアップロードすることはできません。ここでの問題は、このjarがint型のgetContentLengthというメソッドを呼び出しているため、リクエストがInteger.MAX_VALUEまでのサイズしか処理できないことです。 1.3のような共通ファイルアップロードの最新バージョンでは、これが解決されました。 これが役立つことを願っています。

    関連する問題