2009-03-03 16 views
5

Jestem bardzo nowe do ASP.NET MVC, więc proszę być możliwie opisowa w swojej odpowiedzi :)Przesyłam kilka zdjęć + pola tekstowe w ASP.NET MVC

Pozwól uproszczenie co usiłuję zrobić. Wyobraź sobie, że mam formularz, w którym chcesz podać informacje o samochodzie. Mogą to być: Make, Model, Year, Image1, Image2.

U dołu formularza znajduje się przycisk "Zapisz". Przyporządkowana metoda Controller zapisze Image1 i Image2 na dysku, uzyska ich nazwy plików i skojarzy je z modelem samochodu, który następnie zostanie zapisany w bazie danych.

Wszelkie pomysły?

Dzięki chłopaki!

Edit

winob0t got me większość drogi tam. Jedyny nierozstrzygnięty problem jest następujący: Image1 i Image2 nie są wymagane pola, więc teraz mogę zapisać 0,1 lub 2 obrazy; ale jeśli użytkownik przesyła tylko jedno zdjęcie, nie mam pojęcia, czy pochodzi on z imageUpload1 czy imageUpload2.

Ponownie, każda pomoc jest doceniana!

Odpowiedz

7

W kontrolerze można uzyskać dostęp do przesłanych plików jako:

if(Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) { 
     HttpPostedFileBase postFile = Request.Files.Get(0); 
     string filename = GenerateUniqueFileName(postFile.FileName); 
     postFile.SaveAs(server.MapPath(FileDirectoryPath + filename)); 
    } 

protected virtual string GenerateUniqueFileName(string filename) { 

    // get the extension 
    string ext = Path.GetExtension(filename); 
    string newFileName = ""; 

    // generate filename, until it's a unique filename 
    bool unique = false; 

    do { 
     Random r = new Random(); 
     newFileName = Path.GetFileNameWithoutExtension(filename) + "_" + r.Next().ToString() + ext; 
     unique = !File.Exists(FileDirectoryPath + newFileName); 
    } while(!unique); 
    return newFileName; 
} 

polach tekstowych przyjedzie na działania kontrolera jak zwykle tj Request.Form [...]. Zauważ, że będziesz musiał również ustawić typ encji w formularzu na "wieloczęściowy/formularz danych". Wygląda na to, że rozumiesz wystarczająco dużo o ASP.NET MVC, aby zrobić resztę. Zauważ również, że możesz zadeklarować swój tag formularza w widoku aspx w następujący sposób, ale możesz użyć bardziej tradycyjnego podejścia, jeśli chcesz.

<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %> 

<% } %> 
+0

Masz mnie w połowie drogi! Tylko jeden drobny problem: Image1 i Image2 nie mogą tam być. A co jeśli użytkownik dostarcza tylko Image2, a nie Image1? Czy istnieje sposób sprawdzenia, z której kontroli wysyłania pochodzi? –

+0

zamiast Request.Files [0] powinieneś móc używać Request.Files ["formInputname"] – LaserJesus

+0

if (Request.Files ["formInputname"]! = Null && Request.Files ["formInputname"]. ContentLength> 0) – LaserJesus

1

Oto moje rozwiązanie, powyższa odpowiedź nie zadziałała w mojej sytuacji. Nie ma w nim nic wspólnego ze specyfikacją formularza i umożliwia wielokrotne przesyłanie.

for (int i = (Request.Files.Count - 1); i >= 0; i--) 
    { 
      if (Request.Files != null && Request.Files[i].ContentLength > 0) 
      { 
       string path = this.Server.MapPath("~/Content/images/"); 
       string filename = Path.GetFileName(Request.Files[i].FileName); 
       string fullpath = Path.Combine(path, filename); 
       Request.Files[i].SaveAs(fullpath); 
      } 
    } 
Powiązane problemy