6

可変サイズのファイル (非常に大きいまたは非常に小さい) を ASP.NET MVC 2 アプリケーション ファイル システムにアップロードするための最良の方法は何ですか?

これは私がこれまでに理解していることです:

人々がこれを処理する方法は2つあるようです。(ファイルが非常に大きいか非常に小さいと仮定しましょう)

Request.Files(1)またはを介し​​てコントローラ アクションでアップロードを処理しHttpPostedFileBaseます。これには、ASP.NET がファイルをアクティブ メモリにロードするため、時間がかかるという欠点があるようです。

また

(2) 何らかの方法でパフォーマンスの問題を回避する HttpModule を使用して、早い段階でファイルのアップロードを傍受します。(これがどのように機能するかについては少し曇っていますが、この投稿を使用しています http://darrenjohnstone.net/2008/07/15/aspnet-file-upload-module-version-2-beta-1/参考までに)。 私が曖昧な部分は、ASP.NET が送信されたファイルをアクティブなメモリにロードする時点と、モジュールでこれをインターセプトすると実際にこの動作がどのように変化するかです。

2 番目のオプションの方が高速であるため、より適切なオプションのように思えます。しかし、アップロード フォームを送信するアプリケーションには、データベースに保持する必要があるファイルに関連付けられたデータが含まれている可能性が高いようです。HttpHandler または HttpModule で永続呼び出しを行いたくありません (コントローラーと http ハンドラーの 2 つの非常によく似た機能が異なる場所で発生するため)。

回避策の1 つは、ターゲット ファイルの場所を HttpContext.Items に格納することだと思いますが、これが最善の方法ですか?

これに関する最後の懸念事項は、ファイルのアップロードが完了する前に HttpResponse をレンダリングしたいということです。そのため、大きなファイルがある場合は、ユーザーにアップロード ステータスの値を含むビューを送信し、AJAX 呼び出しを行ってステータスを更新します。 アップロード プロセスを続行しながら結果をレンダリングするにはどうすればよいですか? AsyncHandler または AsyncController を作成する必要がありますか? 別のスレッドを手動で取得する必要がありますか?

どうもありがとう。私はこれが多くの質問であることを知っており、おそらく何かについての一般的な理解の欠如を反映しています. 一般的な理解不足の面白いところは、それらを持っている人は、自分に欠けている理解も理解していない傾向があるということです. .

4

2 に答える 2

2

ASP.NET 2.0 の記憶が正しければ、大きなファイルがディスクにフラッシュされるため、HttpPostedFileBase を使用しても、メモリやパフォーマンスの問題は発生しないはずです。ここで asynccontrollers が解決策であるかどうかはわかりません。asynccontrollers は長時間実行されるサーバー プロセス用です。AsyncControllers の例については、http: //www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx を参照してください。

于 2011-01-25T12:23:03.123 に答える
0

このJavaScriptツールを使用します

これはコントローラーです(IEの動作がおかしいので再確認します):

<HttpPost()> _
Function UploadExcelPriceList(ByVal id As String) As System.String

    Dim bResult As Boolean = False
    Dim IsIE As Boolean = False
    Dim sFileName As String = ""

    If (Request.Files Is Nothing) OrElse (Request.Files.Count = 0) Then
        If String.IsNullOrEmpty(Request.Params("qqfile")) Then
            Return ("{success:false, error:'request file is empty'}")
        Else
            sFileName = Request.Params("qqfile").ToString
        End If
    Else
        sFileName = Request.Files(0).FileName
        IsIE = True
    End If

    If String.IsNullOrEmpty(sFileName) Then
        Return ("{success:false, error:'request file is empty'}")
    End If

    Dim DocumentName As String = Id & Path.GetExtension(sFileName)

    If IsIE Then
        Try
            Request.Files(0).SaveAs(Path.Combine(My.Settings.TempFolder, DocumentName))
        Catch ex As Exception
            Return ("{success:false, error:'" & ex.Message & "'}")
        End Try
    Else
        Try
            If (Request.InputStream IsNot Nothing) AndAlso (Request.InputStream.CanRead) AndAlso (Request.InputStream.Length > 0) Then
                Using fileStream As FileStream = New FileStream(Path.Combine(My.Settings.TempFolder, DocumentName), FileMode.Create)
                    Dim FileBytes(Core.Convert.ToInt32(Request.InputStream.Length)) As Byte
                    Dim bytesRead As Int32 = 0
                    bytesRead = Request.InputStream.Read(FileBytes, 0, FileBytes.Length)
                    fileStream.Write(FileBytes, 0, bytesRead)
                    fileStream.Flush()
                    fileStream.Close()
                    bytesRead = Nothing
                End Using
            End If
        Catch ex As Exception
            Return ("{success:false, error:'" & ex.Message & "'}")
        End Try
    End If

    Return ("{success:true, id: '" & Id & "'}")

End Function

この HTML をビューに配置します。

<div id="PopupExcelUploader" title="Carica Listino Excel">
    <div id="uploaderFile"></div>
</div>

これはJavaScriptです:

function CreateFileUploader() {
    var uploader = new qq.FileUploader({
        element: $('#uploaderFile')[0],
        template: '<div class="qq-uploader">' +
                              '<div class="qq-upload-drop-area"><span>Drop files here to upload</span></div>' +
                              '<div class="qq-upload-button ui-button ui-widget ui-corner-all ui-button-text-only ui-state-default">Seleziona il Listino Excel</div>' +
                              '<ul class="qq-upload-list"></ul>' +
                              '</div>',
        hoverClass: 'ui-state-hover',
        focusClass: 'ui-state-focus',
        action: UploaderAction,
        allowedExtensions: ['xls', 'xlsx'],
        params: { id: ModelId },
        onSubmit: function(file, ext) {
        },
        onComplete: function(id, fileName, responseJSON) {
            if ((responseJSON.success == null) || (responseJSON.success == 'false')) {
                $.jGrowl("Error!", { theme: 'MessageError', life: 3000 });
            }
            else {
                documentUploaded = true;
                $.jGrowl("Document uploaded successfully!", { theme: 'MessageOk', life: 1800 });
                window.setTimeout(function() {
                    $("#PopupExcelUploader").dialog('close');
                    $("#PriceListDynamicGrid").trigger("reloadGrid");
                }, 3000);
            }
        }
    });
}
于 2011-01-25T10:46:07.603 に答える