2012-06-17 18 views
6

पर फोटो अपलोड करें मैं अपने एमवीसी 4 एप्लिकेशन में फोटो अपलोड करने के लिए नियंत्रक बनाने की कोशिश कर रहा हूं। लेकिन मुझे यह त्रुटि मिल रही है। इनपुट मान्य बेस -64 स्ट्रिंग नहीं है क्योंकि इसमें गैर-बेस 64 वर्ण, दो से अधिक पैडिंग वर्ण, या पैडिंग वर्णों के बीच एक गैर-सफेद स्पेस वर्ण शामिल है।एमवीसी 4 फोटो

PhotosController.cs

public class PhotoController : Controller 
    { 
     public ActionResult Index() 
     { 
      using (var ctx = new BlogContext()) 
      { 
       return View(ctx.Photos.AsEnumerable()); 
      } 
     } 

     public ActionResult Upload() 
     { 
      return View(new Photo()); 
     } 

     [HttpPost] 
     public ActionResult Upload(PhotoViewModel model) 
     { 
      var photo = Mapper.Map<PhotoViewModel, Photo>(model); 
      if (ModelState.IsValid) 
      { 
       PhotoRepository.Save(photo); 
       return RedirectToAction("Index"); 
      } 
      return View(photo); 
     } 
    } 

Photo.cs

public class Photo 
    { 
    public int Id { get; set; } 

    public Byte[] File { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public string AlternateText { get; set; } 
    } 

PhotoViewModel.cs

public class PhotoViewModel 
    { 
     public int Id { get; set; } 

     public HttpPostedFileBase File { get; set; } 

     public string Name { get; set; } 

     public string Description { get; set; } 

     public string AlternateText { get; set; } 
    } 

/Photos/Upload.cshtml

@model Rubish.Models.Photo 

    @{ 
     ViewBag.Title = "Upload"; 
    } 

    <h2>Upload</h2> 

    @using (Html.BeginForm("Upload","Photo",FormMethod.Post,new {enctype="multipart/form-data"})) { 
     @Html.ValidationSummary(true) 

     <fieldset> 
      <legend>Photo</legend> 

      <div class="editor-label"> 
       @Html.LabelFor(model => model.Name) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.Name) 
       @Html.ValidationMessageFor(model => model.Name) 
      </div> 

      <div class="editor-label"> 
       @Html.LabelFor(model => model.Description) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.Description) 
       @Html.ValidationMessageFor(model => model.Description) 
      </div> 
      <div class="editor-label"> 
       <label for="file">FileName:</label> 
      </div> 
      <div class="editor-field"> 
       <input name="File" id="File" type="file"/> 
      </div> 
      <p> 
       <input type="submit" value="Create" /> 
      </p> 
     </fieldset> 
    } 

    <div> 
     @Html.ActionLink("Back to List", "Index") 
    </div> 

    @Scripts.Render("~/bundles/jqueryval") 

PhotoRepository

public class PhotoRepository 
    { 
     private static BlogContext _ctx; 

     public PhotoRepository() 
     { 
      _ctx = new BlogContext(); 
     } 

     public static void Save(Photo p) 
     { 
      _ctx.Photos.Add(p); 
      _ctx.SaveChanges(); 
     } 
    } 

उत्तर

15

समस्या आप प्रकार byte[] की है जो File कहा जाता है आपके विचार मॉडल में एक संपत्ति है और आप भी एक कार्रवाई पैरामीटर प्रकार HttpPostedFileBase की file कहा जाता है का उपयोग कर रहे हैं। समस्या यह है कि जब मॉडल बाइंडर आपके मॉडल byte[] पर किसी संपत्ति से मुकाबला करता है तो यह बेस 64 का उपयोग कर अनुरोध मूल्य से अपना मूल्य बांधने का प्रयास करता है। इसके अलावा अनुरोध के अंदर आपके पास अपलोड की गई फ़ाइल का multipart/form-data एन्कोडेड मान है और आपको अपवाद मिलता है।

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

    ... other properties 
} 

और नियंत्रक कार्रवाई अब हो जाएगा:

[HttpPost] 
public ActionResult Upload(PhotoViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // map the domain model from the view model that the action 
     // now takes as parameter 
     // I would recommend you AutoMapper for that purpose 
     Photo photo = ... 

     // Pass the domain model to a DAL layer for processing 
     Repository.Save(photo); 

     return RedirectToAction("Index"); 
    } 
    return View(photo); 
} 

गरीब तरीका

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

<input name="PhotoFile" id="File" type="file"/> 

और आपके नियंत्रक कार्रवाई:

[HttpPost] 
public ActionResult Upload(Photo photo, HttpPostedFileBase photoFile) 
{ 
    ... 
} 
+0

धन्यवाद ऑटोपैपर का उपयोग करने की कोशिश करते समय यह काम करता प्रतीत होता है। यह 'ऑटोमैपर: लापता टाइपमैप कॉन्फ़िगरेशन या असमर्थित मैपिंग' फेंकता है। कोड ऊपर अद्यतन किया गया है –