0

Из курса: Using MongoDB with ASP.NET MVC Demo: Displaying Rental ImagesUsung ASP.NET MongoDB.Driver и я не могу спасти ContextType

^В случае, если у вас есть Pluralsight На данный момент в процессе мы прикрепили изображения в документ «Аренда», затем мы используем некоторую бритву и действие GetImage для отображения изображения в представлении AttachImage.cshtml. Я считаю, что все это работает, изображение привязывается к документу в базе данных.

В: Когда мы сохраняем изображение в базе данных, почему ContentType не добавляется в коллекцию fs.files (GridFS) в базе данных?

Примечание: Я считаю, что код внутри контроллера, который является виновником в или вокруг:

//------------------------------------------ 
var options = new MongoGridFSCreateOptions 
{ 
    Id = imageId, 
    ContentType = file.ContentType 
}; 
//------------------------------------------ 

Доказательство образ был сохранен с использованием GridFS
Proof the image got stored using GridFS

Доказательство ТипСодержимого не получить сэкономленные
Proof ContentType Didn't get saved

AttachImage.cshtml

@model RealEstate.Rentals.Rental 
@{ ViewBag.Title = "AttachImage"; } 

<h4>Attach Rental Image</h4> 

@using (Html.BeginForm(null, null, FormMethod.Post, new {enctype = 
     "multipart/form-data" })) 
{ 
    @Html.AntiForgeryToken() 
<div class="form-horizontal"> 
    <div class="form-group"> 
     <label class="control-label col-md-2">Decription</label> 
     <div class="col-md-10"> 
      @Model.Description 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.Label("Image", new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <input type="file" name="file" id="file" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" value="Attach" class="btn btn-default" /> 
     </div> 
    </div> 
</div> 
} 
@if (Model.HasImage()) 
//Show Image 
{ 
    <img src="@Url.Action("GetImage", new { id = Model.ImageId })" /> 
} 

AttachImage Страница в браузере
AttachImage Page in Browser

RentalsController.cs

namespace RealEstate.Controllers 
{ 
    public class RentalsController : Controller 
    { 
    public readonly RealEstateContext Context = new RealEstateContext(); 

    public ActionResult Post() 
    { 
     return View(); 
    } 

[HttpPost] 
public ActionResult Post(PostRental postRental) 
{ 

    var rental = new Rental(postRental); 
    Context.Rentals.Insert(rental); 
    return RedirectToAction("Index"); 
} 

public ActionResult AttachImage(string id) 
{ 
    var rental = GetRental(id); 
    return View(rental); 
} 

[HttpPost] 
public ActionResult AttachImage(string id, HttpPostedFileBase file) 
{ 
    var rental = GetRental(id); 
    if (rental.HasImage()) 
    { 
     DeleteImage(rental); 
    } 

    StoreImage(file, rental); 
    return RedirectToAction("Index"); 
} 

public ActionResult GetImage(string id) 
{ 
    var image = Context.Database.GridFS 
     .FindOneById(new ObjectId(id)); 
    if (image == null) 
    { 
     return HttpNotFound(); 
    } 

    return File(image.OpenRead(), image.ContentType); 
} 


private Rental GetRental(string id) 
{ 
    var rental = Context.Rentals.FindOneById(new ObjectId(id)); 
    return rental; 
} 

private void DeleteImage(Rental rental) 
{ 
    //Access GrdFS & Delete By ID/Pass ImageID converted to ObjectId 
    Context.Database.GridFS.DeleteById(new ObjectId(rental.ImageId)); 
    rental.ImageId = null; 
    Context.Rentals.Save(rental); 
} 

private void StoreImage(HttpPostedFileBase file, Rental rental) 
{ 
    var imageId = ObjectId.GenerateNewId(); 
    rental.ImageId = imageId.ToString(); 
    Context.Rentals.Save(rental); 
    var options = new MongoGridFSCreateOptions 
    { 
     Id = imageId, 
     ContentType = file.ContentType 
    }; 

     Context.Database.GridFS.Upload(file.InputStream, file.FileName); 
} 

Я не знаю, что еще не проверить, все не только выглядит прямо из моего ective, но это к тройнику (Насколько я могу сказать) из курсов обучения ..

+0

Итак, это была последняя строка кода в контроллере. Мне не удалось передать третий параметр, который устанавливает MIME ContentType из загруженного файла. См. Правильный ответ от Pluralsight Author ниже, ... Спасибо Wes! –

ответ

3

передать параметры MongoGridFSCreateOptions на призыв добавить в качестве последнего аргумента:

Context.Database.GridFS.Upload (file.InputStream, file.FileName, опции);

К счастью, это достаточно легко исправить :)

+0

Я знал это. Что-то глупое. Поэтому в той части курса, где мы добавляем это, вы совершенно четко понимаете, что делать. Но я должен пропустить это, и фактический код находится только на экране в течение 4 секунд, где он показывает последний параметр, а затем возвращается к представлению, где вы не можете увидеть последний параметр. Опять же это моя вина. Но я понимаю, почему я пропустил это, и я ценю вашу помощь, чтобы заставить его работать. Я также должен был видеть, что я создаю переменную options и не использую ее. Это был огромный красный флаг. Я учусь, и я люблю этот курс. Один из моих любимых MVC! –

+1

Рад, что вы наслаждаетесь курсом, да, было трудно работать с 1024x768 и шрифтом 16 точек, который мы использовали! Но это меняется для будущих курсов. Есть ли у вас доступ к материалам премиум-класса, если есть готовый пример. – Wes

+0

У меня нет исходного кода, который я снял с моей подписки. Мне действительно не нравится исходный код, потому что это означает, что я должен заставить себя писать каждую строку. Как вы можете видеть, я почти отключил его без какой-либо помощи. lol Я поощряю других придерживаться этого курса, но это не полная замена для наших проектов RDBMS, но он покажет вам, где вы можете использовать реляционную БД для многих проектов по причинам масштаба Horiz или простоту разработки. –