2014-12-22 2 views
1

Я долгое время пробовал с последним шагом, загружал изображение в папку. Я сделал это без сохранения пути к базе данных. Я хочу, чтобы все это теперь и сейчас информация об изображении и путь к изображению сохраняются в db, но само изображение не будет отображаться в папке IMage. Я перепрыгиваю между Index и Create View. Спасибо заранее за любую помощь и извините за мой английский./Загрузить изображение в папку mvc 5 Сначала код

Create.cshtml

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 



    <h2>@ViewBag.Message</h2> 
    <p> 
     To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. 
    </p> 
    <p> 
     @using (Html.BeginForm("Create", "Imagefiles", FormMethod.Post, new { enctype = "multipart/form-data" })) 
     { 
      @Html.LabelFor(model => model.BildInfo, htmlAttributes: new { @class = "control-label col-md-2" }) 
      @Html.EditorFor(model => model.BildInfo, new { htmlAttributes = new { @class = "form-control" } }) 
      <label for="file">Upload Image:</label> 
      <input type="file" name="file" id="file" /> 
      <input type="submit" value="Upload Image" /> 
     } 
    </p> 

}

INDEX.cshtml

@model IEnumerable<Upload.Models.Imagefiles> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.file) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.BildInfo) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.file) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.BildInfo) 
     </td> 
     <td><img src="~/Images/@item.file" width="100" height="100" /></td> 


     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.FilID }) | 
      @Html.ActionLink("Details", "Details", new { id=item.FilID }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.FilID }) 
     </td> 
    </tr> 
} 

</table> 

IMAGEFILESCONTROLLER.CS

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "FilID,file,BildInfo")] Imagefiles imagefiles, HttpPostedFileBase imagesfiles) 
     { 
      if (ModelState.IsValid) 
      { 
       db.Imagefiles.Add(imagefiles); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      var path = Path.Combine(Server.MapPath("~/Content/Files/"), imagesfiles.FileName); 

      var data = new byte[imagesfiles.ContentLength]; 
      imagesfiles.InputStream.Read(data, 0, imagesfiles.ContentLength); 

      using (var sw = new FileStream(path, FileMode.Create)) 
      { 
       sw.Write(data, 0, data.Length); 
      } 

      return RedirectToAction("Index"); 

ответ

0
if (ModelState.IsValid) 
     { 
      db.Imagefiles.Add(imagefiles); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

Я думаю return RedirectToAction ("Index"); в приведенном выше коде завершает выполнение, прежде чем он достигнет логики сохранения файлов.

Переместить логику сохранения файлов до строки return RedirectToAction («Index»); в блоке if.

Окончательный код будет примерно таким.

[HttpPost] 
      [ValidateAntiForgeryToken] 
      public ActionResult Create([Bind(Include = "FilID,file,BildInfo")] Imagefiles imagefiles, HttpPostedFileBase imagesfiles) 
      { 
       if (ModelState.IsValid) 
       { 
        db.Imagefiles.Add(imagefiles); 
        db.SaveChanges(); 

        var path = Path.Combine(Server.MapPath("~/Content/Files/"), imagesfiles.FileName); 

        var data = new byte[imagesfiles.ContentLength]; 
        imagesfiles.InputStream.Read(data, 0, imagesfiles.ContentLength); 

        using (var sw = new FileStream(path, FileMode.Create)) 
        { 
         sw.Write(data, 0, data.Length); 
        } 

        return RedirectToAction("Index"); 
       } 
       else 
       { 
        //Message to the user 
       } 
      } 
+0

мне жаль говорить это, но все работает отлично, за исключением, что файлы don't получать сохраняются в папку FILES .. :(благодарен за все виды помощи .. –

0

Попробуйте следующий код, если вы все еще не можете сохранить после применения резолюции MrGenius «до возвращения строки RedirectToAction (» Index «)».

Использовать imagesFile.SaveAs (путь) вместо использования FileStream (.SaveAs более подходит для сохранения файлов на диск). Code imagesFile.SaveAs (путь) сохранит физический файл в пути, указанном непосредственно из HttpPostedFileBase, и вы в любом случае сохраните путь к базе данных. Ваш класс SwowWritite может быть виновником здесь. Я попытался записать файл с помощью sw.Write, и ничего не было спасено. FileStream может использоваться для сохранения файлов изображений в databases.

//Direct file save to the path 
var fileName = Path.GetFileName(imagesfiles.FileName); 
var path = Path.Combine(Server.MapPath("~/Content/Files/"), fileName); 
imagesfiles.SaveAs(path); 
Смежные вопросы