2012-05-04 19 views
29

मैं सी # एमवीसी 2 और एएसपी.नेट के साथ काम कर रहा हूं। मेरे रूपों में से एक में एक फ़ाइल इनपुट फ़ील्ड शामिल है जो किसी भी फ़ाइल प्रकार का चयन करने के लिए उपयोग की अनुमति देता है जिसे तब ब्लॉब में परिवर्तित किया जाएगा और डेटाबेस में सहेजा जाएगा।अपलोड करने पर बड़ी फ़ाइलों के लिए मान्य

The connection was reset 
The connection to the server was reset while the page was loading. 

मुझे आपत्ति नहीं है वहाँ के लिए एक 8Mb सीमा है कि: मेरी समस्या यह है कि जब भी कोई उपयोगकर्ता एक फ़ाइल है कि जो निम्न कहते Mb (लगभग 8) मैं एक पृष्ठ त्रुटि मिलती है की एक निश्चित amoutn से अधिक का चयन करता है फाइलें जो उपयोगकर्ता अपलोड कर रहे हैं, हालांकि मुझे मौजूदा त्रुटि को होने से रोकने और उचित सत्यापन संदेश प्रदर्शित करना होगा (अधिमानतः मॉडलस्टेट.एडमोडेल एरर फ़ंक्शन के साथ)। कोई भी मेरी मदद कर सकता हैं? मैं पेज में और कुछ भी होने से पहले त्रुटि को पकड़ने के लिए प्रतीत नहीं कर सकता क्योंकि यह नियंत्रक के भीतर अपलोड फ़ंक्शन में आने से पहले हो रहा है।

उत्तर

66

एक संभावना यह एक कस्टम मान्यता विशेषता लिखना है:

public class MaxFileSizeAttribute : ValidationAttribute 
{ 
    private readonly int _maxFileSize; 
    public MaxFileSizeAttribute(int maxFileSize) 
    { 
     _maxFileSize = maxFileSize; 
    } 

    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 
     return file.ContentLength <= _maxFileSize; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(_maxFileSize.ToString()); 
    } 
} 

और फिर आप एक दृश्य मॉडल हो सकता है:

public class MyViewModel 
{ 
    [Required] 
    [MaxFileSize(8 * 1024 * 1024, ErrorMessage = "Maximum allowed file size is {0} bytes")] 
    public HttpPostedFileBase File { get; set; } 
} 

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      // validation failed => redisplay the view 
      return View(model); 
     } 

     // the model is valid => we could process the file here 
     var fileName = Path.GetFileName(model.File.FileName); 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     model.File.SaveAs(path); 

     return RedirectToAction("Success"); 
    } 
} 

और एक दृश्य:

@model MyViewModel 

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.TextBoxFor(x => x.File, new { type = "file" }) 
    @Html.ValidationMessageFor(x => x.File) 
    <button type="submit">OK</button> 
} 

अब निश्चित रूप से यह काम करने के लिए आप एक पर्याप्त रूप से बड़े मूल्य के लिए web.config में अधिकतम स्वीकृत अपलोड फ़ाइल आकार बढ़ाने के लिए करना होगा:

<!-- 1GB (the value is in KB) --> 
<httpRuntime maxRequestLength="1048576" /> 

और IIS7 के लिए:

<system.webServer> 
    <security> 
     <requestFiltering> 
      <!-- 1GB (the value is in Bytes) --> 
      <requestLimits maxAllowedContentLength="1073741824" /> 
     </requestFiltering> 
    </security> 
</system.webServer> 

अब हम अपनी कस्टम सत्यापन विशेषता को एक कदम आगे ला सकते हैं और बैंडविड्थ को बर्बाद करने से बचने के लिए क्लाइंट साइड सत्यापन सक्षम कर सकते हैं। निश्चित रूप से अपलोड करने से पहले फ़ाइल आकार की पुष्टि करना HTML5 File API के साथ ही संभव है। नतीजतन केवल इस ब्राउज़र का समर्थन करने वाले ब्राउज़र ही इसका लाभ उठा सकेंगे।

तो पहला कदम हमारे कस्टम मान्यता विशेषता IClientValidatable इंटरफ़ेस जो हमें जावास्क्रिप्ट में एक कस्टम एडाप्टर संलग्न करने के लिए अनुमति देगा लागू करने के लिए है:

public class MaxFileSizeAttribute : ValidationAttribute, IClientValidatable 
{ 
    private readonly int _maxFileSize; 
    public MaxFileSizeAttribute(int maxFileSize) 
    { 
     _maxFileSize = maxFileSize; 
    } 

    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file == null) 
     { 
      return false; 
     } 
     return file.ContentLength <= _maxFileSize; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(_maxFileSize.ToString()); 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = FormatErrorMessage(_maxFileSize.ToString()), 
      ValidationType = "filesize" 
     }; 
     rule.ValidationParameters["maxsize"] = _maxFileSize; 
     yield return rule; 
    } 
} 

और जो कुछ बचा है कस्टम एडाप्टर कॉन्फ़िगर है:

jQuery.validator.unobtrusive.adapters.add(
    'filesize', [ 'maxsize' ], function (options) { 
     options.rules['filesize'] = options.params; 
     if (options.message) { 
      options.messages['filesize'] = options.message; 
     } 
    } 
); 

jQuery.validator.addMethod('filesize', function (value, element, params) { 
    if (element.files.length < 1) { 
     // No files selected 
     return true; 
    } 

    if (!element.files || !element.files[0].size) { 
     // This browser doesn't support the HTML5 API 
     return true; 
    } 

    return element.files[0].size < params.maxsize; 
}, ''); 
+0

सबसे पहले, आपको बहुत धन्यवाद डारिन। मैं आपके समाधान को लागू करने का प्रयास कर रहा हूं, हालांकि मैं 'IClientValidatable' का उपयोग करने में सक्षम नहीं हूं। मेरे पास सिस्टम है। वेब।एमवीसी दोनों परियोजना के संदर्भ में और पेज उपयोग में जोड़ा गया। मैं क्या गलत कर रहा हूं? –

+0

मुझे नहीं पता कि आप क्या गलत कर रहे हैं। 'System.Web.Mvc' नामस्थान' के अंदर 'System.Web.Mvc.dll' असेंबली में 'ICLientValidatable' को एएसपी.नेट एमवीसी 3 में जोड़ा गया था। –

+0

मैंने सत्यापित किया और मुझे यह सोचने में गलती हुई कि हम एमवीसी 3 का उपयोग कर रहे थे, हम वास्तव में एमवीसी 2 का उपयोग कर रहे हैं। चूंकि उन्नयन मेरे लिए एक विकल्प नहीं है, क्या इस समाधान का कोई भी हिस्सा अभी भी लागू हो सकता है? –

-1

मैं थोड़ी देर के लिए googled और निम्नलिखित दो यूआरएल के साथ आया जो यह सुझाव देते हैं कि ग्लोबल.एक्सएक्स में एप्लिकेशन की त्रुटि घटना में यह समस्या या अपवाद सबसे अच्छा है।

  1. Catching 'Maximum request length exceeded'
  2. How to handle "Maximum request length exceeded" exception
1

आप web.config में कुछ यूआरएल के लिए अनुरोध अधिकतम लंबाई को बढ़ा सकते हैं:

<location path="fileupload"> 
    <system.web> 
    <httpRuntime executionTimeout="600" maxRequestLength="10485760" /> 
    </system.web> 
</location> 
संबंधित मुद्दे