এমভিসি 3 ফাইল আপলোড এবং মডেল বাইন্ডিং


91

আমার একটি ফর্ম আপলোড রয়েছে যা কাজ করে তবে আমি অবশ্যই একটি ভিন্ন নামের সাথে ফাইলটি সংরক্ষণ করতে আমার ডাটাবেসের জন্য মডেল তথ্যটি পাস করতে চাই।

এখানে আমার রেজার ভিউ:

@model CertispecWeb.Models.Container

@{
  ViewBag.Title = "AddDocuments";
}

<h2>AddDocuments</h2>

@Model.ContainerNo

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, 
            new { enctype = "multipart/form-data" }))
{
    <input type='file' name='file' id='file' />
    <input type="submit" value="submit" />
}

এখানে আমার নিয়ামক:

[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
     if (file.ContentLength > 0)
     {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"),
                       containers.ContainerNo);
        file.SaveAs(path);
     }

     return RedirectToAction("Index");
}

মডেল তথ্য নিয়ামকের মাধ্যমে প্রেরণ করা হয় না। আমি পড়েছি যে আমার সম্ভবত মডেলটি আপডেট করার প্রয়োজন হতে পারে, আমি এটি কীভাবে করব?


4
পড়ুন stackoverflow.com/questions/9411563/... একটি সম্পর্কিত সমস্যার জন্য
LCJ

উত্তর:


123

আপনার ফর্মটিতে ফাইলটি ব্যতীত অন্য কোনও ইনপুট ট্যাগ নেই তাই আপনার নিয়ন্ত্রক ক্রিয়ায় আপনি আপলোড করা ফাইল (সার্ভারে যা পাঠানো হচ্ছে এটির চেয়েও বেশি) পাওয়ার কিছুই আশা করতে পারবেন না। এটি অর্জনের একটি উপায় হ'ল মডেলের আইডি সম্বলিত একটি লুকানো ট্যাগ অন্তর্ভুক্ত করা যা আপনাকে পোস্ট করা কন্ট্রোলার অ্যাকশনের অভ্যন্তরে এটি আপনার ডেটাস্টোর থেকে পুনরুদ্ধার করার অনুমতি দেবে (ব্যবহারকারী যদি মডেলটি সংশোধন না করে তবে এটি ব্যবহার করুন) কেবল একটি ফাইল সংযুক্ত করুন):

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.HiddenFor(x => x.Id)
    <input type="file" name="file" id="file" />
    <input type="submit" value="submit" />
}

এবং তারপরে আপনার নিয়ামক পদক্ষেপে:

[HttpPost]
public ActionResult Uploadfile(int id, HttpPostedFileBase file)
{
    Containers containers = Repository.GetContainers(id);
    ...
}

অন্যদিকে আপনি যদি ব্যবহারকারীকে এই মডেলটি সংশোধন করার অনুমতি দিতে চান তবে আপনাকে আপনার মডেলের প্রতিটি ক্ষেত্রে যথাযথ ইনপুট ক্ষেত্রগুলি অন্তর্ভুক্ত করতে হবে যা আপনি সার্ভারে প্রেরণ করতে চান:

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.TextBoxFor(x => x.Prop1)
    @Html.TextBoxFor(x => x.Prop2)
    @Html.TextBoxFor(x => x.Prop3)
    <input type="file" name="file" id="file" />
    <input type="submit" value="submit" />
}

এবং তারপরে অনুরোধ থেকে আপনার কাছে এই মডেলটিকে পুনরায় গঠন করতে হবে ডিফল্ট মডেল বাইন্ডার:

[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
    ...
}

4
আমি fileহিসাবে 0 পেয়ে যাচ্ছি nullএবং Request.Files.Count0 তেও আছে, যদি সেখানে formএকটি হয় তবে সেখানে কোনও পার্থক্য AjaxFormথাকবে routeValues?
bjan

8

সমাধান হয়েছে

মডেল

public class Book
{
public string Title {get;set;}
public string Author {get;set;}
}

নিয়ামক

public class BookController : Controller
{
     [HttpPost]
     public ActionResult Create(Book model, IEnumerable<HttpPostedFileBase> fileUpload)
     {
         throw new NotImplementedException();
     }
}

এবং দেখুন

@using (Html.BeginForm("Create", "Book", FormMethod.Post, new { enctype = "multipart/form-data" }))
{      
     @Html.EditorFor(m => m)

     <input type="file" name="fileUpload[0]" /><br />      
     <input type="file" name="fileUpload[1]" /><br />      
     <input type="file" name="fileUpload[2]" /><br />      

     <input type="submit" name="Submit" id="SubmitMultiply" value="Upload" />
}

নিয়ামক পদক্ষেপ থেকে প্যারামিটারের নোটের শিরোনাম অবশ্যই ইনপুট উপাদানগুলির নামের সাথে মেলে IEnumerable<HttpPostedFileBase> fileUpload->name="fileUpload[0]"

fileUpload মেলানো


4
একাধিক ফাইলের জন্য এই সমাধানটিই আমি খুঁজে পেয়েছি solution আপনার কোড ভাগ করে নেওয়ার জন্য ধন্যবাদ।
রোজন ঘ।

6

যদি আপনার ক্রিয়ায় সবসময় ছবি পোস্ট করা না থাকে আপনি এই জাতীয় কিছু করতে পারেন:

[HttpPost]
public ActionResult Uploadfile(Container container, HttpPostedFileBase file) 
{
    //do container stuff

    if (Request.Files != null)
    {
        foreach (string requestFile in Request.Files)
        {
            HttpPostedFileBase file = Request.Files[requestFile]; 
            if (file.ContentLength > 0)
            {
                string fileName = Path.GetFileName(file.FileName);
                string directory = Server.MapPath("~/App_Data/uploads/");
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                string path = Path.Combine(directory, fileName);
                file.SaveAs(path);
            }
        }
    }

} 

1

একাধিক ফাইলের জন্য; ইনপুট জন্য নতুন " একাধিক " বৈশিষ্ট্য নোট করুন:

ফর্ম:

@using (Html.BeginForm("FileImport","Import",FormMethod.Post, new {enctype = "multipart/form-data"}))
{
    <label for="files">Filename:</label>
    <input type="file" name="files" multiple="true" id="files" />
    <input type="submit"  />
}

নিয়ামক:

[HttpPost]
public ActionResult FileImport(IEnumerable<HttpPostedFileBase> files)
{
    return View();
}

1

নীচে url থেকে jquery.form.js ফাইলটি ডাউনলোড করুন

http://plugins.jquery.com/form/

সিএসটিএমএলে কোড নীচে লিখুন

@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data", id = "frmTemplateUpload" }))
{
    <div id="uploadTemplate">

        <input type="text" value="Asif" id="txtname" name="txtName" />


        <div id="dvAddTemplate">
            Add Template
            <br />
            <input type="file" name="file" id="file" tabindex="2" />
            <br />
            <input type="submit" value="Submit" />
            <input type="button" id="btnAttachFileCancel" tabindex="3" value="Cancel" />
        </div>

        <div id="TemplateTree" style="overflow-x: auto;"></div>
    </div>

    <div id="progressBarDiv" style="display: none;">
        <img id="loading-image" src="~/Images/progress-loader.gif" />
    </div>

}


<script type="text/javascript">

    $(document).ready(function () {
        debugger;
        alert('sample');
        var status = $('#status');
        $('#frmTemplateUpload').ajaxForm({
            beforeSend: function () {
                if ($("#file").val() != "") {
                    //$("#uploadTemplate").hide();
                    $("#btnAction").hide();
                    $("#progressBarDiv").show();
                    //progress_run_id = setInterval(progress, 300);
                }
                status.empty();
            },
            success: function () {
                showTemplateManager();
            },
            complete: function (xhr) {
                if ($("#file").val() != "") {
                    var millisecondsToWait = 500;
                    setTimeout(function () {
                        //clearInterval(progress_run_id);
                        $("#uploadTemplate").show();
                        $("#btnAction").show();
                        $("#progressBarDiv").hide();
                    }, millisecondsToWait);
                }
                status.html(xhr.responseText);
            }
        });

    });


</script>

ক্রিয়া পদ্ধতি: -

 public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            return View();
        }

 public void Upload(HttpPostedFileBase file, string txtname )
        {

            try
            {
                string attachmentFilePath = file.FileName;
                string fileName = attachmentFilePath.Substring(attachmentFilePath.LastIndexOf("\\") + 1);

           }
            catch (Exception ex)
            {

            }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.