2010-06-11 28 views
12

Tôi đang cố gắng thêm điều khiển tải tệp lên mẫu ASP.NET MVC 2 của mình nhưng sau khi tôi chọn một jpg và nhấp vào Lưu , nó cung cấp cho các lỗi sau:Lỗi tải lên tệp ASP.NET MVC - "Dữ liệu nhập không phải là chuỗi Base-64 hợp lệ"

Đầu vào không phải là chuỗi Base-64 hợp lệ vì nó chứa ký tự không phải là 64 cơ sở, nhiều hơn hai ký tự đệm hoặc ký tự khoảng trống trắng giữa các ký tự đệm.

Dưới đây là quan điểm:

<% using (Html.BeginForm("Save", "Developers", FormMethod.Post, new {enctype = "multipart/form-data"})) { %> 
    <%: Html.ValidationSummary(true) %> 
    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      Login Name 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.LoginName) %> 
      <%: Html.ValidationMessageFor(model => model.LoginName) %> 
     </div> 

     <div class="editor-label"> 
      Password 
     </div> 
     <div class="editor-field"> 
      <%: Html.Password("Password") %> 
      <%: Html.ValidationMessageFor(model => model.Password) %> 
     </div> 

     <div class="editor-label"> 
      First Name 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.FirstName) %> 
      <%: Html.ValidationMessageFor(model => model.FirstName) %> 
     </div> 

     <div class="editor-label"> 
      Last Name 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.LastName) %> 
      <%: Html.ValidationMessageFor(model => model.LastName) %> 
     </div> 

     <div class="editor-label"> 
      Photo 
     </div> 
     <div class="editor-field"> 
      <input id="Photo" name="Photo" type="file" /> 
     </div> 

     <p> 
      <%: Html.Hidden("DeveloperID") %> 
      <%: Html.Hidden("CreateDate") %> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
<% } %> 

Và bộ điều khiển:

//POST: /Secure/Developers/Save/ 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Save(Developer developer) 
     { 
      //get profile photo. 
      var upload = Request.Files["Photo"]; 
      if (upload.ContentLength > 0) 
      { 
       string savedFileName = Path.Combine(
         ConfigurationManager.AppSettings["FileUploadDirectory"], 
         "Developer_" + developer.FirstName + "_" + developer.LastName + ".jpg"); 
       upload.SaveAs(savedFileName); 
      } 
      developer.UpdateDate = DateTime.Now; 
      if (developer.DeveloperID == 0) 
      {//inserting new developer. 
       DataContext.DeveloperData.Insert(developer); 
      } 
      else 
      {//attaching existing developer. 
       DataContext.DeveloperData.Attach(developer); 
      } 
      //save changes. 
      DataContext.SaveChanges(); 
      //redirect to developer list. 
      return RedirectToAction("Index"); 
     } 

Cảm ơn, Justin

Trả lời

6

Tôi chỉ cố gắng mã của bạn và đã có thể tải lên mà không bất kỳ vấn đề. Tôi đã không lưu vào cơ sở dữ liệu cũng như lớp Developer của tôi có thuộc tính Photo.

namespace MvcApplication5.Controllers 
{ 
    public class Developer 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public DateTime UpdateDate { get; set; } 
     public int DeveloperID { get; set; } 
     public string LoginName { get; set; } 
     public string Password { get; set; } 
    } 
} 

khiển

public class DefaultController : Controller 
{ 
    // 
    // GET: /Default/ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Save(Developer developer) 
    { 
     //get profile photo. 
     var upload = Request.Files["Photo"]; 
     if (upload.ContentLength > 0) 
     { 
      string savedFileName = Path.Combine(
        @"C:\temp", 
        "Developer_" + developer.FirstName + "_" + developer.LastName + ".jpg"); 
      upload.SaveAs(savedFileName); 
     } 
     developer.UpdateDate = DateTime.Now; 
     if (developer.DeveloperID == 0) 
     {//inserting new developer. 

     } 
     else 
     {//attaching existing developer. 

     } 
     //save changes. 

     //redirect to developer list. 
     return RedirectToAction("Index"); 
    } 

} 

Xem

<div> 
     <% using (Html.BeginForm("Save", "Default", FormMethod.Post, new { enctype = "multipart/form-data" })) 
      { %> 
     <%: Html.ValidationSummary(true)%> 
     <fieldset> 
      <legend>Fields</legend> 
      <div class="editor-label"> 
       Login Name 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.LoginName)%> 
       <%: Html.ValidationMessageFor(model => model.LoginName)%> 
      </div> 
      <div class="editor-label"> 
       Password 
      </div> 
      <div class="editor-field"> 
       <%: Html.Password("Password")%> 
       <%: Html.ValidationMessageFor(model => model.Password)%> 
      </div> 
      <div class="editor-label"> 
       First Name 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.FirstName)%> 
       <%: Html.ValidationMessageFor(model => model.FirstName)%> 
      </div> 
      <div class="editor-label"> 
       Last Name 
      </div> 
      <div class="editor-field"> 
       <%: Html.TextBoxFor(model => model.LastName)%> 
       <%: Html.ValidationMessageFor(model => model.LastName)%> 
      </div> 
      <div class="editor-label"> 
       Photo 
      </div> 
      <div class="editor-field"> 
       <input id="Photo" name="Photo" type="file" /> 
      </div> 
      <p> 
       <%: Html.Hidden("DeveloperID")%> 
       <%: Html.Hidden("CreateDate")%> 
       <input type="submit" value="Save" /> 
      </p> 
     </fieldset> 
     <%} %> 
    </div> 
+1

Đó không phải là một vấn đề vì lỗi được ném trước khi nó đi vào hành động điều khiển để nó không liên quan đến việc lưu vào db. Tôi đang thua lỗ b/c Tôi nghĩ rằng lỗi này có liên quan đến việc không có enctype = "multipart/form-data" và tôi rõ ràng có ... – Justin

+8

Thực ra bạn đã cho tôi những gì tôi cần để khắc phục. Bạn không có thuộc tính Photo, và tôi có một thuộc tính [] Photo byte để nó cố gắng gán tệp tải lên nó, điều này rõ ràng không hoạt động. Tôi đổi tên file ProfilePhoto và sau đó nó hoạt động. – Justin

16

Gần đây tôi đã tìm thấy một giải pháp cho điều này, mặc dù bây giờ tôi đang sử dụng MVC3 hơn MVC2.

Trong các Lưu hành động, loại trừ lĩnh vực nhị phân từ đối tượng bị ràng buộc và bao gồm một lĩnh vực riêng biệt HttpPostedFileBase:

ví dụ

public ActionResult Save([Bind(Exclude = "Photo")]Developer developer, HttpPostedFileBase Photo) {...} 

Lưu ý rằng bạn cũng có thể thực hiện việc này để tránh phải bao gồm phần tử Html.Hidden từ Chế độ xem của mình. ví dụ:

public ActionResult Save([Bind(Exclude = "Photo,DeveloperID,CreateDate")]Developer developer, HttpPostedFileBase Photo) {...} 

Bạn có thể sử dụng đối tượng HttpPostedFileBase này trực tiếp thay vì cần truy cập Request.Files.

Cá nhân, tôi thực sự lưu trữ các loại hình ảnh trong cơ sở dữ liệu trong một SQL "hình ảnh" lĩnh vực sử dụng mã này:

if (Picture != null) 
{ 
    if (Picture.ContentLength > 0) 
    { 
     byte[] imgBinaryData = new byte[Picture.ContentLength]; 
     int readresult = Picture.InputStream.Read(imgBinaryData, 0, Picture.ContentLength); 
     Developer.Picture = imgBinaryData; 
    } 
} 

Hy vọng điều này là hữu ích ...

Đánh dấu

+0

Cảm ơn @Mark van Proctor, giải pháp của bạn đã làm việc cho tôi. –

1

Tôi có cùng một vấn đề. đây là giải pháp tôi tìm thấy. sở hữu Class:

public byte[] Logo { get; set; } 

Xem Code:

@using (Html.BeginForm("StoreMyCompany", "MyCompany", FormMethod.Post, new { id = "formMyCompany", enctype = "multipart/form-data" })) 
{ 
<div class="form-group"> 
    @Html.LabelFor(model => model.modelMyCompany.Logo, htmlAttributes: new { @class = "control-label col-md-3" }) 
    <div class="col-md-6"> 
    <input type="file" name="Logo" id="fileUpload" accept=".png,.jpg,.jpeg,.gif,.tif" /> 
    </div> 
</div> 
} 

khiển Code:

public ActionResult StoreMyCompany([Bind(Exclude = "Logo")]MyCompanyVM model) 
    { 
     try 
     { 
      Company objCompany = new Company(); 

      byte[] imageData = null; 
      if (Request.Files.Count > 0) 
      { 
       HttpPostedFileBase objFiles = Request.Files["Logo"]; 

       using (var binaryReader = new BinaryReader(objFiles.InputStream)) 
       { 
        imageData = binaryReader.ReadBytes(objFiles.ContentLength); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Utility.LogError(ex); 
     } 

     return View(); 
    } 
} 

tôi chỉ loại trừ Logo từ cuộc gọi điều khiển của.

Các vấn đề liên quan