1

MVC4 アプリケーション内で jquery ラッパーを使用して、fineuploader v3.9 UI を使用しています。この時点で、validation sizeLimit プロパティで設定されているように、2.5MB のファイルのみを許可する必要があると思います。現在の問題は、サポートされていないファイル タイプまたは大きすぎるファイルをアップロードすると、次のエラー ポップアップが表示されることです。

ここに画像の説明を入力

エラー ハンドラーが起動していないようで、サーバー側コード内のブレークポイントがヒットしません。そうは言っても、小さなファイルを選択すると、コントローラー メソッド コードのブレークポイントで停止し、すべて正常に動作します (アップロードの成功)。大きすぎるファイルやアップロードが許可されていないファイルで何が起こっているのかについての手がかりはありますか?

これが私のビューからのすべてのファインアップローダーjsコードです。「完了」と「送信済み」のイベントを処理しているため、アップロード中にボタンを正しく有効/無効にすることができ、これらは問題なく起動します。ただし、「エラー」ハンドラがどうなっているのかはわかりません。UI jQuery の方法で「qq」オブジェクト参照を使用できますか? 他の場所では使用されていないので、これは私の問題でしょうか? 考え?

// Uploader control setup
    var fineuploader = $('#files-upload').fineUploader({            
        request:
        {
            endpoint: '@Url.Action("UploadFile", "Survey")',
            customHeaders: { Accept: 'application/json' },
            params: {
                surveyInstanceId: (function () { return instance; }),
                surveyItemResultId: (function () { return surveyItemResultId; }),
                itemId: (function () { return itemId; }),
                loopingIndex: (function () { return loopingCounter++; })
            }             
        },
        validation: {
            acceptFiles: ['image/*','application/xls','application/pdf', 'text/csv', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel'] , 
            allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'csv', 'xls', 'xlsx', 'pdf', 'xlt', 'xltx', 'txt'],
            sizeLimit: 1024*1024*2.5, // 2.5MB
            stopOnFirstInvalidFile: false
        },
        multiple: true,
        text: {
            //uploadButton: '<i class="icon-plus icon-white"></i>Select your upload file(s)'
            uploadButton: 'Select your upload file(s)'
        }   
    }).on('submitted', function(event, id, filename) {
        alert('submitted ' + filename);
        filesToUpload++;
        $(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');         
    }).on('complete', function(event, id, filename, responseJSON) {                            
        alert('completed ' + filename);
        uploadedFileCounter++;
        if (filesToUpload == uploadedFileCounter)
        {
            $(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');                                                
        }                           
    }).on('error', function(event,id, name, errorReason, xhr) {         
        alert(qq.format("Error on file number {} - {}.  Reason: {}", id, name, errorReason));
    });

});

アップロード中にヒットしたサーバーメソッドのシェルは次のとおりです。

 [HttpPost]
    public JsonResult UploadFile(HttpPostedFileWrapper qqfile, int surveyInstanceId, int surveyItemResultId, int itemId, int loopingIndex)
    {
        try
        {
            bool isValid = false;               

    // MORE UPLOAD CODE

            if (isSaveValid && isResultItemEntryValid)
                isValid = true;

            return CreateJsonResult(isValid);
        }

    }

そして、JSON 成功メッセージを返す私のメソッド

  private JsonResult CreateJsonResult(bool isSuccess)
    {
        var json = new JsonResult();
        json.ContentType = "text/plain";
        json.Data = new { success = isSuccess };
        return json;
    }

これはすべて、FireFox v24 および Chrome v30 では正しく機能しますが、IE 9 では、デバッグ コンソール内で次のように表示されます。

ここに画像の説明を入力

IE では、送信済みイベントと完了イベントが発生しますが、アップロードは失敗します。他のブラウザでは、正しい最大サイズ超過エラーが表示され、イベントは発生しません。

4

2 に答える 2

2

DEBUG を使用すると、IE で発生するエラーは「Maximum Request Length Exceeded」です。

これは (少なくとも私にとっては) プロジェクトの web.config に次の値を追加することで解決できます: system.web の値は kbs 単位なので、例として 1GB です

<system.web>
    <httpRuntime maxRequestLength="1048576" />
</system.web>

また、IIS でホストしている場合は、次を追加します: maxAllowedContentLength はバイト単位です。

<system.webServer>
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
  </requestFiltering>      
</security>
</system.webServer>

これで、アプリケーションを実行すると、コンソール出力はエラーではなく、適切な FALSE が返されます。

LOG: [FineUploader 3.9.0-3] Received 1 files or inputs. 
LOG: [FineUploader 3.9.0-3] Sending upload request for 0 
LOG: [FineUploader 3.9.0-3] Received response for 0_874e4439-c5c0-4b95-970f-16eb1cf89405 
LOG: [FineUploader 3.9.0-3] iframe loaded 
LOG: [FineUploader 3.9.0-3] converting iframe's innerHTML to JSON 
LOG: [FineUploader 3.9.0-3] innerHTML = <PRE>{"success":false}</PRE> 

さらに更新 ここでは、JSON リターン内に設定されたカスタム エラー メッセージの「failedUploadTextDisplay」を示す、FineUploader コードからの小さなカットを示します。

   validation: {
            acceptFiles: ['image/*','application/xls','application/pdf', 'text/csv', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','application/vnd.ms-excel'] , 
            allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'csv', 'xls', 'xlsx', 'pdf', 'xlt', 'xltx', 'txt'],
            sizeLimit: 1024*1024*2.5, // 2.5MB
            stopOnFirstInvalidFile: false
        },  
        failedUploadTextDisplay: {
            mode: 'custom'
        },

以下は、FineUploader によって呼び出されるサーバー メソッドの一部です。IE9 以前の場合、クライアント側の fileSize 検証は、コードがサーバーに戻るのを止めません。contentlength をチェックするサーバー側の検証を追加し、JSON リターンを作成するメソッドを呼び出します。

   [HttpPost]
    public JsonResult UploadFile(HttpPostedFileWrapper qqfile, int surveyInstanceId, int surveyItemResultId, int itemId, int loopingIndex)
    {
        try
        {
            bool isValid = false;

            // file is too big, throw error.
            if (qqfile.ContentLength > (1024*1024*2.5))
            {
                return CreateJsonResult(false, "File size exceeded, max file is 2.5MB.");                    
            }

JSON リターンを作成するメソッドを次に示します。エラーの場合は、必要なカスタム テキストを含む「エラー」プロパティも返します。

 private JsonResult CreateJsonResult(bool isSuccess, string response = "")
    {
        var json = new JsonResult();
        json.ContentType = "text/plain";

        if (!isSuccess)
        {
            json.Data = new { success = isSuccess, error = response };
        }
        else
        {
            json.Data = new { success = isSuccess };
        }

        return json;
    }
于 2013-10-08T17:23:40.853 に答える
1

コンソール メッセージによると、サーバーが何らかの無効な応答を返しています。これらのブラウザーではクライアント側でファイル サイズを決定する方法がないため、IE9 以前ではファイル サイズの制限が適用されないことに注意してください。具体的には、サーバーが何を返しているかを確認するには、ネットワーク トラフィックを詳しく調べる必要があります。debugFine Uploader でこのオプション を有効にすると、応答ペイロードの内容が JavaScript コンソールに出力されます。

于 2013-10-08T16:57:26.430 に答える