6

परिवर्तनीय आकार की फ़ाइलों को अपलोड करने के लिए सबसे अच्छी विधि क्या है (या तो एएसपी.नेट एमवीसी 2 एप्लिकेशन फ़ाइल सिस्टम के लिए बहुत बड़ी या बहुत छोटी)?एएसपी.नेट एमवीसी 2 के साथ फाइल अपलोड करने का सबसे अच्छा तरीका क्या है?

यह मैं अब तक क्या समझ है:

ऐसा लगता है कि वहाँ दो तरीके है कि लोगों को इस संभाल रहे हैं। (की फ़ाइलों को लगता है बहुत बड़ी या बहुत छोटे हो सकते हैं)

(1) Request.Files या HttpPostedFileBase के माध्यम से एक नियंत्रक कार्रवाई में अपलोड, जो एक लंबे समय लेने के एक दोष है लगता है संभाल क्योंकि ASP.NET फ़ाइलों को लोड करता है सक्रिय स्मृति में।

या

(2) फ़ाइल एक HttpModule जो किसी भी तरह के प्रदर्शन मुद्दा गतिरोध उत्पन्न साथ जल्दी पर अपलोड अवरोधन। (मैं यह कैसे काम करता है पर थोड़ा बादल हूं, लेकिन मैं इस पोस्ट का उपयोग http://darrenjohnstone.net/2008/07/15/aspnet-file-upload-module-version-2-beta-1/ संदर्भ के रूप में कर रहा हूं)। जिस भाग में मैं अस्पष्ट हूं, वह इस बात पर है कि एएसपी.नेट ने सबमिट की गई फ़ाइलों को सक्रिय मेमोरी में लोड किया है, और मॉड्यूल में इसे कैसे रोकना वास्तव में इस व्यवहार को बदलता है।

चूंकि दूसरा विकल्प तेज़ है, यह बेहतर विकल्प की तरह लगता है। लेकिन ऐसा लगता है कि एक अपलोड फॉर्म जमा करने वाले एप्लिकेशन में शायद उस फ़ाइल से जुड़े कुछ डेटा होंगे जिन्हें डेटाबेस में जारी रखने की आवश्यकता है। मैं अपने एचटीपी हैंडलर या एचटीपी मॉड्यूल में दृढ़ता से कॉल नहीं करना चाहता, (क्योंकि तब मेरे पास अलग-अलग स्थानों में होने वाली दो बहुत ही समान कार्यक्षमताएं होंगी: नियंत्रक और http हैंडलर)।

मुझे लगता है कि आसपास एक काम HttpContext.Items में लक्ष्य फ़ाइल स्थान को संग्रहीत करना होगा, लेकिन यह सबसे अच्छा तरीका है?

इस बारे में एक आखिरी चिंता यह है कि फ़ाइल अपलोड होने से पहले मैं एक HttpResponse प्रस्तुत करना चाहता हूं। इसलिए, यदि कोई बड़ी फ़ाइल है, तो मैं उपयोगकर्ता को अपलोड स्थिति के मूल्य के साथ एक दृश्य भेजूंगा, और स्थिति को अद्यतन रखने के लिए AJAX कॉल कर दूंगा। अपलोड प्रक्रिया को जारी रखते हुए, मैं परिणाम कैसे प्रस्तुत करूं? क्या मुझे AsyncHandler या AsyncController बनाने की आवश्यकता है? क्या मुझे मैन्युअल रूप से एक और धागा पकड़ने की ज़रूरत है?

बहुत बहुत धन्यवाद। मुझे पता है कि यह बहुत सारे प्रश्न हैं, और शायद कुछ के बारे में समझने की सामान्य कमी को दर्शाता है। समझने की सामान्य कमी के बारे में मजाकिया बात यह है कि जिन लोगों के पास उन्हें समझ में कमी है, उन्हें समझने की कमी नहीं है ... इसलिए, अगर कोई मुझे उस नोट पर सही दिशा में इंगित कर सकता है, तो मैं इसकी सराहना करता हूं ।

+0

[फ़ाइल अपलोड एमवीसी] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/765211/file-upload-mvc) – jgauffin

+0

क्या आप मजाक कर रहे हैं? – smartcaveman

+0

@jguaffin - जो प्रश्न आप लिंक करते हैं वह इस मुद्दे से संबंधित नहीं है। – Fenton

उत्तर

2

यदि मुझे एएसपी.NET 2.0 से सही तरीके से याद है, तो बड़ी फ़ाइलों को डिस्क पर फ़्लश किया जा रहा है, इसलिए HttpPostedFileBase का उपयोग करने से भी कोई मेमोरी/प्रदर्शन समस्या नहीं होनी चाहिए। मुझे यकीन नहीं है कि asynccontrollers यहां एक समाधान है, asynccontrollers लंबे चल रहे सर्वर प्रक्रियाओं के लिए है।AsyncControllers के उदाहरण के लिए http://www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx

+0

क्या आपका मतलब है कि AsyncController और AJAX के संबंध में एक सामान्य नियम के रूप में? वह क्यों होगा? – smartcaveman

+0

ने मेरा जवाब बदल दिया AJAX और asynccontrollers के बारे में लाइन झूठी – Wim

+0

क्लाइंट साइड पर http://www.uploadify.com/ का उपयोग कर रही है और सर्वर की तरफ एक साधारण HttpPostedFileBase आपकी समस्या का समाधान नहीं है? – Wim

0

मैं इस जावास्क्रिप्ट tool

इस नियंत्रक है का उपयोग करें (मैं अच्छी तरह जांच लें कारण आईई एक अजीब व्यवहार है):

<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> 

और यह जावास्क्रिप्ट है:

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); 
      } 
     } 
    }); 
} 
+0

कोड नमूने के लिए धन्यवाद, लेकिन यह प्रश्न का समाधान नहीं करता है। – smartcaveman

संबंधित मुद्दे

 संबंधित मुद्दे