2015-08-24 7 views
5

Jestem bardzo początkujący w asp.net mvc. tutaj miałem problem z przesłaniem obrazu kontrolera ktokolwiek może udzielić pomocy? Ten przykład kontroler mam z internetu, co należy zmienić, a kod viewnya podoba, tutaj chcę zapisać obraz poprzez "AvatarUrl"Chcesz zapisać obrazek do folderu i zapisać adres URL w bazie danych

typu> EmployeeServices

public class EmployeeModel{ 

    [ScaffoldColumn(false)] 
    public int EmployeeID { get; set; } 

    [Required(ErrorMessage = "Please Enter Position ID")] 
    public int PositionID { get; set; } 

    [Required(ErrorMessage = "Please Enter NO PEK")] 
    public string NoPEK { get; set; } 

    [Required(ErrorMessage = "Please Enter NO KTP")] 
    public string NoKTP { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxID")] 
    public string TaxID { get; set; } 

    [Required(ErrorMessage = "Please Enter FirstName")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please Enter LastName")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Please Enter OrganizationID")] 
    public int OrganizationID { get; set; } 

    [Required(ErrorMessage = "Please Enter BirthPlace")] 
    public string BirthPlace { get; set; } 

    [Required(ErrorMessage = "Please Enter BirthDay")] 
    public System.DateTime BirthDay { get; set; } 

    [Required(ErrorMessage = "Please Enter Gender")] 
    public string Gender { get; set; } 

    [Required(ErrorMessage = "Please Enter Religion")] 
    public string Religion { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxAddress")] 
    public string TaxAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Home Address")] 
    public string HomeAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Current Address")] 
    public string CurrentAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Phone Number")] 
    public string PhoneNumber { get; set; } 

    [Required(ErrorMessage = "Please Enter Email")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Please Enter IsAuditor")] 
    public string IsAuditor { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxProvince ")] 
    public int TaxProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Tax City ")] 
    public int TaxCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Home Province ")] 
    public int HomeProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Home City")] 
    public int HomeCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Current Province")] 
    public int CurrentProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Current City")] 
    public int CurrentCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Avatar Url")] 
    public string AvatarUrl { get; set; } 
} 

Controller> EmployeesController

[HttpPost] 
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) 
    { 
     if (ModelState.IsValid) 
     { 
      var filename = Path.GetFileName(file.FileName); 
      var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
      file.SaveAs(path); 
      tyre.Url = filename; 

      _db.EventModels.AddObject(eventmodel); 
      _db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(eventmodel); 
    } 
+0

możesz zrobić: '' eventmodel.AvatarUrl = "~/Uploads/Photo /" + nazwa pliku; '' przed linią '' _db.EventModels.AddObject (eventmodel); '' –

Odpowiedz

9

Przesyłanie pliku, przechowywanie w lokalnym systemie plików i zapisywanie do bazy danych jest wspólny wzór. Oto moje rekomendacje.

1. Nie używaj przesłanej nazwy pliku jako nazwy pliku.

Jest to często:

var filename = Path.GetFileName(file.FileName); 
var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
file.SaveAs(path); 

nie rób tego. Istnieje kilka powodów:

a) Nazwy plików mogą być w konflikcie. b) Nazwy plików zdalnych mogą być niekompatybilne z lokalnym systemem plików. c) Ktoś może wypróbować złośliwą nazwę pliku, co może spowodować uszkodzenie serwera.

Zamiast tego należy wygenerować własną nazwę pliku (prawdopodobnie przy użyciu identyfikatora GUID, GUID.NewGuid().ToString()) i zapisać oryginalną nazwę pliku w bazie danych.

2. Nie przechowywać wszystkie pliki w jednym folderze

W pewnym momencie, folder będzie zawierał zbyt wiele plików dla systemu operacyjnego do przetwarzania szybko.

Podziel pliki według czegoś przydatnego, np. ID użytkownika. Pomaga to również segregować pliki między użytkownikami.

3. Nie przechowywać pełną ścieżkę dostępu do pliku w bazie danych

W pewnym momencie, można przenieść pliki (być może na innym dysku), a wszystkie zapisane lokalizacje plików zostanie przerwane .

4. Nie przechowywać URL obrazu w bazie

samo jak # 3. Jeśli Twoja aplikacja internetowa ulegnie zmianie i chcesz zmienić adresy URL obrazów, masz niepoprawne adresy URL zapisane w bazie danych. Będziesz musiał skanować i aktualizować wszystkie rekordy bazy danych.

5. Nie przechowywać informacje nadmiarowe ścieżki w bazie

Chociaż może to być kuszące, aby to „Przesłane/Zdjęcia /” w URL przechowywane w bazie danych, to ma zbyt wiele problemów:

a) To nadmiarowe dane. Dla każdego pliku używasz dodatkowej, niepotrzebnej przestrzeni danych. b) Jeśli Twoja aplikacja zmieni się, a adres URL powinien się zmienić, twoje zapisane adresy URL zostaną teraz zerwane.

Zamiast tego dodaj "Przesłane/Zdjęcie /" do adresu URL po odczytaniu wartości z bazy danych.

Aktualizacja:

Oto przykładowy kod:

[HttpPost] 
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) 
    { 
     if (ModelState.IsValid) 
     { 
      var originalFilename = Path.GetFileName(file.FileName); 
      string fileId = Guid.NewGuid().ToString().Replace("-", ""); 
      string userId = GetUserId(); // Function to get user id based on your schema 

      var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), userId, fileId); 
      file.SaveAs(path); 

      eventModel.ImageId = fileId; 
      eventmodel.OriginalFilename = originalFilename; 

      _db.EventModels.AddObject(eventmodel); 
      _db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(eventmodel); 
    } 

jednak byłbym ostrożny na temat korzystania z modelu danych jako model działania MVC.

1

należy zmienić AvatarUrl do:

public HttpPostedFileBase AvatarUrl { get; set; } 

W twoim widoku możesz utworzyć formularz podobny do poniższego. Dodaj pola, na które przyjmiesz dane wejściowe i użyj danych wejściowych do swojego awatara. Kiedy formularz zostanie wysłany do kontrolera, MVC podejmie próbę powiązania danych wejściowych z parametrami.

@using(Html.BeginForm("Create", FormMethod.Post, new { enctype = "multipart/form-data" }) { 
    <fieldset> 
     @Html.LabelFor(m => m.FirstName) 
     @Html.EditorFor(m => m.FirstName) 
    </fieldset> 
    <!--  
    REST OF YOUR INPUT FIELDS HERE 
    --> 
    <fieldset> 
     @Html.LabelFor(m => m.Avatar) 
     @Html.EditorFor(m => m.Avatar) 
    </fieldset> 
    <input type="submit" value="Submit" /> 
}) 

Twoja metoda kontroler powinien zostać zaktualizowana:

[HttpPost] 
public ActionResult Create(EmployeeModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Create avatar on server 
     var filename = Path.GetFileName(model.AvatarUrl.FileName); 
     var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
     file.SaveAs(path); 
     // Add avatar reference to model and save 
     model.AvatarUrl = string.Concat("Uploads/Photo/", filename); 
     _db.EventModels.AddObject(model); 
     _db.SaveChanges(); 

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

Jeśli jesteś nadal tkwi daj mi znać, a ja mogę iść do bardziej szczegółowo.

Jest również doskonałym/szczegółowo napisać podobne do tego, co próbujemy zrobić tutaj http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/