<इनपुट प्रकार = "फ़ाइल" /> के लिए Html सहायक


124

वहाँ एक है HTMLHelperफ़ाइल अपलोड करने के लिए? विशेष रूप से, मैं एक की जगह के लिए देख रहा हूँ

<input type="file"/>

ASP.NET MVC HTMLHelper का उपयोग करना।

या, अगर मैं उपयोग करता हूं

using (Html.BeginForm()) 

फ़ाइल अपलोड के लिए HTML नियंत्रण क्या है?

जवाबों:


207

HTML अपलोड फ़ाइल ASP MVC 3।

मॉडल : ( ध्यान दें कि FileExtensionsAttribute MvcFutures में उपलब्ध है। यह फ़ाइल एक्सटेंशन क्लाइंट और सर्वर साइड को मान्य करेगा। )

public class ViewModel
{
    [Required, Microsoft.Web.Mvc.FileExtensions(Extensions = "csv", 
             ErrorMessage = "Specify a CSV file. (Comma-separated values)")]
    public HttpPostedFileBase File { get; set; }
}

HTML दृश्य :

@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new 
                                       { enctype = "multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.File, new { type = "file" })
    @Html.ValidationMessageFor(m => m.File)
}

नियंत्रक कार्रवाई :

[HttpPost]
public ActionResult Action(ViewModel model)
{
    if (ModelState.IsValid)
    {
        // Use your file here
        using (MemoryStream memoryStream = new MemoryStream())
        {
            model.File.InputStream.CopyTo(memoryStream);
        }
    }
}

यह एक फ़ाइल इनपुट को प्रस्तुत नहीं करता है <input type="file" />, केवल एक पाठ बॉक्स
बेन

@PauliusZaliaduonis लाइन Microsoft.Web.Mvc.FileExtensions के साथ MVC को लाल रंग में रेखांकित किया गया है। मुझसे इसका समाधान किस प्रकार होगा?
पोमस्टर

1
@pommy ध्यान दें कि FileExtensionsAttribute MvcFutures (MVC3 के रूप में) में उपलब्ध है। आप यहाँ से स्रोतों का उपयोग कर सकते हैं: स्रोत या यह .NET फ्रेमवर्क 4.5 में उपलब्ध है, MSDN प्रलेखन
पॉलियस ज़ालियाडूनिस

1
दुर्भाग्य से FileExtension विशेषता HttpPostedFileBase प्रकार की संपत्तियों के साथ काम नहीं करता है, बल्कि यह केवल स्ट्रिंग लगता है। कम से कम यह एक वैध विस्तार के रूप में पीडीएफ को कभी स्वीकार नहीं करता था।
सेरज सगन

इसमें एक मान विशेषता (मान = "") जोड़ा जाएगा जो मान्य HTML5 के रूप में मान्य नहीं है। इनपुट प्रकार फ़ाइल और छवि पर मान मान्य नहीं है। मुझे मान विशेषता को हटाने का कोई तरीका नहीं दिख रहा है। यह हार्ड-कोडेड लगता है।
दान फ्रेडमैन

19

आप भी उपयोग कर सकते हैं:

@using (Html.BeginForm("Upload", "File", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
    <p>
        <input type="file" id="fileUpload" name="fileUpload" size="23" />
    </p>
    <p>
        <input type="submit" value="Upload file" /></p> 
}

8

कुछ समय पहले मेरा भी यही सवाल था और स्कॉट हैन्समैन के पोस्ट में से एक आया:

ASP.NET MVC के साथ टेस्ट और मोक्स सहित HTTP फ़ाइल अपलोड को लागू करना

उम्मीद है की यह मदद करेगा।


धन्यवाद, लेकिन मैं विशेष रूप से (Html.BeginForm ()), अन्य वेरिएंट का उपयोग करने के कार्यान्वयन की तलाश में हूं।
Graviton

6

या आप इसे ठीक से कर सकते हैं:

अपने HtmlHelper एक्सटेंशन क्लास में:

public static MvcHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
    {
        return helper.FileFor(expression, null);
    }

public static MvcHtmlString FileFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        var builder = new TagBuilder("input");

        var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
        builder.GenerateId(id);
        builder.MergeAttribute("name", id);
        builder.MergeAttribute("type", "file");

        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        // Render tag
        return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
    }

यह रेखा:

var id = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));

मॉडल के लिए एक अद्वितीय आईडी बनाता है, आप सूचियों और सामान में जानते हैं। मॉडल [को ०] ।नाम आदि।

मॉडल में सही संपत्ति बनाएँ:

public HttpPostedFileBase NewFile { get; set; }

फिर आपको यह सुनिश्चित करने की आवश्यकता है कि आपका फॉर्म फाइलें भेजेगा:

@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" }))

फिर यहाँ आपका सहायक है:

@Html.FileFor(x => x.NewFile)

यह समाधान अधिक नेत्र कैंडी है, और मुझे @Html सहायक विधियों के अनुरूप रखता है।
यहुफ्फी

4

पॉलियस ज़ालियाडूनिस के उत्तर का उन्नत संस्करण:

सत्यापन कार्य को ठीक से करने के लिए मुझे मॉडल को इसमें बदलना पड़ा:

public class ViewModel
{
      public HttpPostedFileBase File { get; set; }

        [Required(ErrorMessage="A header image is required"), FileExtensions(ErrorMessage = "Please upload an image file.")]
        public string FileName
        {
            get
            {
                if (File != null)
                    return File.FileName;
                else
                    return String.Empty;
            }
        }
}

और देखने के लिए:

@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new 
                                       { enctype = "multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.File, new { type = "file" })
    @Html.ValidationMessageFor(m => m.FileName)
}

यह आवश्यक है क्योंकि @Serj Sagan ने केवल स्ट्रिंग के साथ काम करने वाले FileExtension विशेषता के बारे में लिखा था।


क्या आप इस उत्तर को पॉलियस के उत्तर में नहीं मिला सकते हैं?
ग्रेविटन

2

उपयोग करने के लिए BeginForm, यहाँ इसका उपयोग करने का तरीका दिया गया है:

 using(Html.BeginForm("uploadfiles", 
"home", FormMethod.POST, new Dictionary<string, object>(){{"type", "file"}})

2
पहले आप एक इनपुट एलिमेंट जेनरेट करने का उल्लेख करते हैं, और अब आप फॉर्म एलिमेंट कैसे जेनरेट करते हैं? क्या यह वास्तव में आपका जवाब है?
पुतीनो

0

यह भी काम करता है:

नमूना:

public class ViewModel
{         
    public HttpPostedFileBase File{ get; set; }
}

राय:

@using (Html.BeginForm("Action", "Controller", FormMethod.Post, new 
                                       { enctype = "multipart/form-data" }))
{
    @Html.TextBoxFor(m => m.File, new { type = "file" })       
}

नियंत्रक कार्रवाई:

[HttpPost]
public ActionResult Action(ViewModel model)
{
    if (ModelState.IsValid)
    {
        var postedFile = Request.Files["File"];

       // now you can get and validate the file type:
        var isFileSupported= IsFileSupported(postedFile);

    }
}

public bool IsFileSupported(HttpPostedFileBase file)
            {
                var isSupported = false;

                switch (file.ContentType)
                {

                    case ("image/gif"):
                        isSupported = true;
                        break;

                    case ("image/jpeg"):
                        isSupported = true;
                        break;

                    case ("image/png"):
                        isSupported = true;
                        break;


                    case ("audio/mp3"):  
                        isSupported = true;
                        break;

                    case ("audio/wav"):  
                        isSupported = true;
                        break;                                 
                }

                return isSupported;
            }

सामग्री की सूची


-2

यह मेरे हिसाब से थोड़ा सा हैकी है, लेकिन इसके परिणामस्वरूप सही सत्यापन विशेषताओं आदि को लागू किया जाता है

@Html.Raw(Html.TextBoxFor(m => m.File).ToHtmlString().Replace("type=\"text\"", "type=\"file\""))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.